あかはば

ドローンやMacなどなど

動画配信

Facebook Liveに叱られる

投稿日:

晴れて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ダウンロードページ

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はコマンドプロンプトから利用しました。

  1. nginxを起動
  2. stunnelを起動
  3. ATEM mini proで配信開始
  4. ffmpegを起動

という順序でうまく動かすことができましたが、ATEM mini proからのストリームが途切れるとffmpegが落ちるので、nginxがストリームを受信するのとともにffmpegが起動する形にできる方が良いのですが、、、。この辺りもこれから調べていこうと思います。

-動画配信
-, , , ,

Copyright© あかはば , 2020 All Rights Reserved Powered by STINGER.