さくらのクラウドGPUインスタンスを用いたCloudNative配信技術の解説

こんにちは、CloudNative Days というカンファレンスイベントの配信チームをリーディングしている、かめねこです。今回は、CloudNative Days の配信を支えていた仕組みと、さくらのクラウドを活用した事例をご紹介します。
目次
はじめに
CloudNative Daysは、クラウドネイティブ技術に特化したカンファレンスイベントです。コンテナやKubernetes、Prometheusなどのクラウドネイティブ技術を広めることを目的としています。
現在はオフラインとオンラインのハイブリッド開催で、多くの方にご登壇・ご参加いただけるイベントになっています。 本イベントは、従来はオフライン開催がメインでした。そして、2020年。新型コロナウイルス感染症の蔓延により、多くのイベントが自粛を求められ、CloudNative Daysも例外ではありませんでした。
それでも、イベントを多くの方に届けたい一心で、さまざまな取り組みを行ってきました。本当はそのすべてをご紹介したいのですが、いくら時間があっても足りません。そこで今回は、「クラウドスイッチャー」を活用した配信についてご紹介します。なお、その他の事例はこちらのブログで参照できます。
OBSでクラウドスイッチャーを構築する
OBSを使ってクラウドスイッチャーを構築する方法をご紹介します。まず、クラウドスイッチャーとはなんでしょうか。 クラウドスイッチャーは、クラウド上に映像切替装置を構築することを指します。 映像切替装置は、「ビデオスイッチャー」とも呼ばれ、複数のカメラ映像を切り替えたり、合成したりする装置のことです。 スイッチャー自体は、物理的な機材もありますし、OBS のようなソフトウェアベースのものもビデオスイッチャーの一種と言えます。今回は、Nginx と OBS を活用してクラウドスイッチャーを構築する方法をご紹介します。
全体の構成
全体の構成は次のとおりです。
スタジオのOBSからクラウド上のNginxでRTMPを受信し、クラウド上のOBSからNginxの映像を取得。そこで、シーンを切り替えて配信します。 配信先は、今回はAWSのストリーミング系サービス群であるAWS Media Serviceです。 それぞれ解説します。
スタジオOBS
スタジオOBSは、物理的なスタジオに設置されたPCで、キャプチャボード経由でカメラの映像や音声をクラウドに打ち上げます。 基本的には、映像を打ち上げるためのエンコーダとして利用するため、OBSである必要はあまりなく、RTMPを出力できればなんでも大丈夫です。 また、映像のスイッチング操作はクラウドで行うため、スタジオからの映像は登壇者の有無に関係なく、常に送り出され続けます。
RTMP受信用Nginx
スタジオOBSから打ち上げた映像は、クラウド上のNginxで受信します。 Nginxは、非常に有名なWebサーバですが、実はRTMPの受信機能も備えています。この機能を利用するためには、NginxにRTMPモジュールを含めてビルドする必要があります。
以下のように、RTMPモジュールのパスを指定してmakeすることで、NginxにRTMPモジュールを組み込んだバイナリをビルドできます。
./configure --add-module=/path/to/nginx-rtmp-module
make
make install
その他に、以下のようなコマンドを実行することで、ビルドをせずともRTMPモジュールを含めたNginxをインストールできるようです。
sudo apt install -y nginx libnginx-mod-rtmp
その後、以下のような設定ファイルを書くことで、RTMPの受信ができるようになります。
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
}
}
}
OBS では、rtmp://${NGINX_IP}:1935/live/${STREAM_KEY}
の形式で Nginx に映像を送信できます。${NGINX_IP}
は Nginx の IP アドレス、${STREAM_KEY}
には任意の文字列を指定します。
そして同様に、VLCメディアプレーヤーなど、RTMPを再生可能なソフトウェアで、同一のURLを呼び出すと、送出された映像を再生できます。
なお、実はRTMPモジュールは長くメンテナンスされていないため、これから利用する場合には、本番用途での利用は推奨されていません。代わりに、SRSというOSSが同様の機能を有しています。 CloudNative Daysでも、最終的にはSRSを採用しました。SRSは、RTMP以外にも、SRTなどのプロトコルも利用可能です。
クラウドOBSで映像を受信する
受信した映像をクラウドOBSに取り込むため、OBSの「メディアソース」機能を利用します。 メディアソースは、内部ではffmpegを利用しています。 ffmpegは、映像データの変換・再生によく使われますが、それ以外にも、RTMPやSRTなどのストリーミングプロトコルの入力に対応しています。 そのため、OBSのメディアソースでも、RTMPを入力することが可能です。RTMPを入力する際は、メディアソースの「ローカルファイル」のチェックを外し、「入力」に前述のNginxやSRSのと同一のURLを指定することで、映像を取り込むことができます。
OBSはデフォルトでは、対象のシーンが有効になったタイミングでメディアソースなどのソースをアクティブに動作します。 そのため、シーンを切り替えてすぐはRTMPの受信を行っており、数秒はブラックアウトした状態です。これを回避するために、メディアソースの設定の「ソースがアクティブになったときに再生を再開する」のチェックを外すことで、バックグラウンドでも常に再生されます。
なお、これを有効にした場合には、常に映像を受信し続けることになるため、負荷がかかることに注意してください。 すぐに使わないストリームや、もう使わないストリームは、チェックを入れておくなどの工夫が必要かもしれません。
クラウドOBSでのスイッチングと送出
このようにRTMPの映像を取得したOBSで、複数のシーンを作成します。 セッション中は、必ずしもスタジオの登壇者の映像とは限らず、リモート登壇や事前収録などの複数の登壇方法がありました。 リモート登壇であれば、CloudNative DaysではStreamYardというSaaSを利用しており、これの映像のシーンを利用します。 事前収録であれば、クラウドOBSに事前に動画を保存しておき、これをメディアソースで再生します。
その他にも、オープニングやキーノート、クロージングはトラックAの映像を利用したいため、トラックA以外のクラウドOBSでは、トラックAのNginxの映像を受信したメディアソースのシーンを用意しました。
これらを、任意のタイミングで切り替え、配信サーバへ送出していました。また、切り替えには通常GUIの操作が必要でしたが、操作ミスなどの事故のリスクがあったため、OBS Websocketというプラグインを利用し、CLI経由で切り替えを行いました。シーンの切り替えにあたっては、cndctlというコマンドを作成し、cndctl next
のようなコマンドを実行することで、簡単に次のシーンへ切り替えることができました。
実際にクラウドスイッチャーをやってみて
さて、技術的には意外と簡単な技術で実現できましたが、実際のところはどうだったのでしょうか。 運用してみたところ、なんとも難しい結論になりました。というのも、現地の映像を送出してから、クラウドOBSで確認し、これをさらに配信するとなると、各セクションのラグが顕著に影響し、タイミングが合わせづらかったのです。 特に登壇者が話し始める際は、現地の担当者が合図をしますが、クラウドのスイッチングのほうが早かったり、逆に遅かったりすることも多々ありました。
このような問題が浮き彫りになったと同時に、新型コロナウイルスの影響が減少し、オフラインイベントの活気が戻ってきたことから、このようなクラウドスイッチャーの導入は終え、各種物理機材の導入に切り替わりました。 クラウドスイッチャーは、主にオンラインベースのイベントには親和性が高かったですが、オフラインまたはハイブリッドでは、物理機材のほうが安定しているという結論に至りました。ただし、クラウドスイッチャーを構築するにあたって、RTMPの基礎知識や、OBSの仕組みなどについてメンバー全体が詳しくなり、これは別の形で現在も役に立っています。 技術としては大変おもしろいので、今後何かしらの形で活用できる日が来るかもしれません。
まとめ
今回はクラウドスイッチャーを自前で構築し、カンファレンスイベントで活用した事例を紹介しました。 運用面での課題が浮き彫りになりましたが、さまざまなメリット・デメリットがあり、ケースによっては非常に有用な方法だと改めて感じます。また、本件を実行するにあたって、さくらのクラウドのコミュニティ支援を提供していただき、クラウドGPUを複数利用させていただくことができました。この場を通じて改めて感謝いたします。ありがとうございます。 さくらのクラウドは、特にネットワークトラフィックに対する課金が基本料金に含まれているため、このような映像・配信系の利用には非常に親和性が高いと感じます。 ぜひ、クラウドスイッチャーを構築する際には、さくらのクラウドを検討してみてください。
ちなみに、CloudNative Daysでは、毎年カンファレンスイベントを開催しています。 現在は夏に地方、冬に東京で開催する形態になっており、今年の夏は沖縄で開催します。 これからCfPの募集や、その後の一般参加の募集も開始しますので、ぜひ興味がある方はご参加ください。 当日は、私を含めた複数のメンバーが配信チームとして参加しますので、もし本記事の内容や、配信技術・機材についてご興味があればお気軽にお声がけください。