晴れてYoutubeとFacebookに同時配信できるようになったわけですが、Facebook Liveのイベントログをみたら数秒おきに叱られます。
解像度が高すぎます。
配信に使っているATEM mini proは4Kの入出力はできませんが、フルHD画像1920 x 1080までは出力できます。youtube Liveも1920 x 1080の入力ができますが、Facebookの方は1280 x 720のHD画質が最高画質のようです。ですからATEM mini proから出力された動画ストリームがNginxを介してYoutubeとFacebookにそれぞれ中継配信されますが、同じ画質ビットレートで配信されるため、Facebookには数秒おきに叱られる始末です。
叱られるもののテスト配信ではうまく配信できていたので、構わないといえば構わないのですが、、、数秒おきに叱られるのは嫌ですよねぇ〜〜〜。
ということで、ATEM mini proから送られてくるストリームをYoutube向けにはそのままで中継配信し、Facebook向けてにはトランスコードして1280 x 720の画質に落として配信することにしました。
この辺り何かシンプルなやり方がないか調べていたのですが、いまいちスッキリしたやり方が見つかりません。HLS(HTTP Live Streaming)というApple社が独自開発した規格を利用すると、視聴環境に合わせたビットレートで柔軟に配信する仕組みをNginx-RTMPに組み合わせて使う方法が色々見つかりましたが、私がしたいのは1つのストリームを解像度の異なる2つのストリームに分ける方法です。
解像度などを変更するにはffmpegを利用すれば良いことがわかり、これはRTMPなど動画ストリームにも使えることがわかりましたので、今回はこれを使ってみることにしました。
ATEM mini proからmultiというアプリケーション名で配信されたRTMPストリームをffmpegにて取り込み、解像度を1280x720に変更して、liveというアプリケーション名でRTMPストリームをNginxに返し、それを改めてstunnelを通じてFacebookに配信しようと思います。
ffmpegのサイトではソースコードとともに、Linux、Windows、Mac用のパッケージも用意されています。今回は Windows版のパッケージを利用しました。
ffmpegの使い方は、
ffmpeg 入力オプション 入力ファイル名 出力オプション 出力ファイル名
で、入力ファイル、出力ファイルにはRTMPストリームも利用できます。
ffmpeg -i rtmp://localhost:1935/multi/test \-vf scale=-1:720 \-f flv rtmp://localhost:1935/live/test;
解像度を1280x720に変更する出力オプション -vf scale=-1:720
を加え、liveというアプリケーション名でローカルホストのNginxにRTMP配信しました。今回の変更に対応したnginx.confは以下のとおりです。
worker_processes 1;
error_log logs/error.log info;
events {
worker_connections 1024;
}
rtmp {
server {
listen 1935;
chunk_size 4096;
application multi {
live on;
record off;
push rtmp://a.rtmp.youtube.com/live2/<Youtubeストリームキー>;
}
application live {
live on;
record off;
push rtmp://127.0.0.1:19350/rtmp/<Facebook liveストリームキー>;
}
}
}
これでテストをしたところ、YoutubeにもFacebookにも配信できて、やった〜〜〜!と喜んでいたところ、Facebookのイベントログにこんな表示が。
映像のコーデックが違うとか、無効なオーディオコーデックだとか、フレームレートが低いなど、続々と警告が出ました。また、映像のビットレートが低いのでこの辺りも対応することにしました。
今回利用したffmpegのオプション
-vcodec libx264 映像コーデックにH.264を利用
-vb 6000k 映像ビットレートを6000kbpsにする
-vf scale=-1:720 解像度を1280x720に変更
-force_key_frames expr:gte(n,n_forced*60) キーフレームを2秒毎に入れる
-acodec copy 音声コーデックはオリジナルのまま
最初、-vcodec copyとして映像コーデックはオリジナルのままとしたところ、解像度の変更をしているのでダメですと言われました。
最終的に利用したffmpegのコマンドは以下のとおりです。
ffmpeg -i rtmp://localhost:1935/multi/test -vcodec libx264 -vb 6000k -vf scale=-1:720 -force_key_frames expr:gte(n,n_forced*60) -acodec copy -f flv rtmp://localhost:1935/live/test;
本当は、Nginxの中でffmpegを利用したかったのですが、exec ffmpegとしてnginx.confの中で設定する方法がわからなかったので、ffmpegはコマンドプロンプトから利用しました。
- nginxを起動
- stunnelを起動
- ATEM mini proで配信開始
- ffmpegを起動
という順序でうまく動かすことができましたが、ATEM mini proからのストリームが途切れるとffmpegが落ちるので、nginxがストリームを受信するのとともにffmpegが起動する形にできる方が良いのですが、、、。この辺りもこれから調べていこうと思います。