FRESH!でサーバサイドエンジニアをしております、 hori_ryota です。
負荷テストや開発用に勝手に動画配信をし続けてくれる環境が欲しくなったので思いを馳せてみました。
やりたいこと
目的
- 視聴側の開発のため、延々と動画が流れている環境がほしい
- 配信まわりのテストを自動化したい
- 配信サーバの負荷テストのため、大量の動画配信をしたい
視聴側のみのテストであれば魔改造した配信サーバを用意することで対応できますが、 FRESH! は生放送サービスのため配信側のテストも必要となります。
現状
- 各開発者が必要なときに自分で配信も用意している
- 配信テストは人力
- 負荷テストは複数 PC で頑張る
つらい
今回の目標
- スケールする自動配信環境
ということで、今回は Docker でコンテナ化した配信環境を用意しようと思います。
Docker であれば local からでもサーバ上からでもサクッと立ち上げられますし、スケールもできそうですね。
構築手順
FFmpeg はインストールなどの準備で詰まりがちなのですが、幸い先駆者の Docker Image があるのでお借りすることにします。良い時代ですね。
配信データですが、簡単のため今回は作成する Docker Image に混ぜてしまいます。 Docker Image は軽い方が何かと嬉しいので、実運用するときはファイルサーバからダウンロードするのもありかと思います。
ということで、作成する Dockerfile は以下のようになりました。
FROM jrottenberg/ffmpeg
COPY src.mp4 ./
COPY start.sh ./
ENTRYPOINT ./start.sh
Dockerfile と同階層に動画データ src.mp4
と起動スクリプト start.sh
を用意します。
start.sh
に配信コマンドを記述します。
#!/bin/bash
ffmpeg -re -stream_loop -1 -i 'src.mp4' -f flv "${TARGET_RTMP_URL}"
-stream_loop -1
で無限ループにしています。
必要に応じてサービスで想定している配信に合わせて codec などのオプションを設定してください。 FRESH! だととりあえずこんな感じ…?(FRESH! での動作を保証するものではありません。仮です。)
ffmpeg -re -stream_loop -1 -i 'src.mp4' -vcodec libx264 -x264-params keyint=30 -acodec aac -f flv "${TARGET_RTMP_URL}"
src.mp4
ですが、解像度などの変換処理が入ると負荷が高くなるので、予め想定している配信に合わせて変換しておくことをおすすめします。
あとは Docker Image を作るだけ。
$ docker build hori-ryota/auto-broadcast .
実行
${TARGET_RTMP_URL}
を変数化しているので、 -e
オプションで渡して実行します。
$ docker run -e TARGET_RTMP_URL="rtmp://foo/bar/baz" hori-ryota/auto-broadcast
きっと配信できるはず!
以上
指定の配信サーバ向けに配信する Docker Image が用意できました。
シンプルなシェルスクリプトでの実行なので、サービスや環境に合わせて ${TARGET_RTMP_URL}
の自動生成を組み込んだり、 api 経由で取得して配信などもできるかと思います。
FFmpeg のインプットにビデオデバイスなどを指定すれば本配信でも使えますね!
続編(予定)
- Selenium あたりを用いて配信準備も含めた一連の配信フローのテスト自動化
- 負荷テストで使ってみる
- 配信データが正常かどうかのテスト自動化(FFmpeg でやるか、 Media Stream Validator Tool を使うか、 Playlist の更新チェックだけするか)
- 各プレーヤー側で再生できるかのテスト自動化(きっとクライアント側の誰かがやってくれる…はず!)
配信先 URL の設定部分を自動化すれば拡張性のある自動配信環境がサクッと立ち上げられるので、サービスの開発運用フローに組み込んでみたいと思います。
これからも安定した配信環境を提供できるよう努めてまいりますので、今後とも FRESH! をよろしくお願いいたします。