Nginx-RTMPを介したライブストリーミング:既製のレシピ

私は最近、 nginxのRoman Harutyunyan(@rarutyunyan)の素晴らしいモジュールについてのトピック「 nginxベースのオンラインブロードキャスト サーバー 」に出会いました: nginx-rtmp-module 。 このモジュールは設定が非常に簡単で、nginxに基づいてビデオやライブブロードキャストを公開するためのサーバーを作成できます。

モジュールについてはGitHubのページで読むことができますが、簡単な使用例をいくつか示します。 このトピックがビデオビジネスの初心者(私のような)に役立つことを願っています。


RTMPの概要


RTMP(リアルタイムメッセージングプロトコル)は、アドビシステムズ独自のブロードキャストプロトコルです。 デフォルトのトランスポートはTCP(ポート1935)です。 HTTPでRTMP(RTMPT)をカプセル化することもできます。 RTMPクライアントは、主にAdobe Flash Playerです。
ビデオコーデック-H.264、AACオーディオコーデック、nellymoserまたはMP3、MP4またはFLVコンテナー。

ビデオを公開する


つまり、ビデオオンデマンド(VOD)です。 nginx.confをrtmpセクション{server {...}}に追加するだけです。
application vod { play /var/videos; } 


(注:もちろん、このセクションをvodと呼ぶ必要はありません)
これで、ビデオファイルを正しい形式で/ var / videosフォルダーに入れ、プレーヤーにプレーヤーを「フィード」することができます(例:rtmp://server/vod/file.flv)。 私が理解しているように、MP4はビデオの巻き戻しをネイティブでサポートしており、FLVは個別にインデックス付けする必要があります。

次の例はすべて、ffmpeg for Windowsを使用した「ライブ」ブロードキャストに関するものです。 ただし、この情報はLinuxユーザーには役立ちます。

生放送


公開用に同じRTMPプロトコルを使用して、ビデオとオーディオのストリームをサーバーに送信できます。 そして、お客様は放送を見ることができます。 これを行うには、サーバーにセクションを追加します。

 application live { allow publish 1.2.3.4; allow publish 192.168.0.0/24; deny publish all; allow play all; live on; } 


例に示すように、信頼できるIP以外のすべてのユーザーへのパブリケーションへのアクセスを直ちにブロックすることをお勧めします。

ブロードキャストするマシンで、最初にDirectShowデバイスのリストを取得する必要があります。 スタート-実行-cmd、ffmpeg / binフォルダーに移動して実行します:
 ffmpeg -list_devices true -f dshow -i dummy 


ソースの名前にロシア語の文字が含まれている場合は、krakozyabramiとして表示できます。 Trub管理者はiconvをハッチングしており、私のような単純な人はLebedevのWebサイトで byakを解読します FFmpegは、読みやすい碑文を提供する必要があります。

これで、ビデオおよびオーディオソースの名前がわかったら、 ffmpegでキャプチャしてサーバーに送信できます。

ウェブカメラ


少なくとも、ビデオソース、コーデック、およびサーバーを指定する必要があります。
 ffmpeg -f dshow -i video="Webcam C170" -c:v libx264 -an -f flv "rtmp://1.2.3.4/live/test.flv live=1" 


「Webcam C170」の代わりに、リストからカメラの名前を置き換える必要があります。
-anスイッチは、オーディオストリームを送信していないことを示します。 オーディオストリームが必要な場合、起動ラインは次のようになります。
 ffmpeg -f dshow -i video="Webcam C170" -f dshow -i audio=" ..." -c:v libx264 -c:a libfaac -ar 44100 -ac 2 -f flv "rtmp://1.2.3.4/live/test.flv live=1" 

ここでは、libfaacコーデック、サンプリングレート44100、2チャネル(ステレオ)を使用します。 AACの代わりにMP3(libmp3lameコーデック)を使用できます。

画像

アナログカメラ


カメラにアナログ出力がある場合は、キャプチャデバイスを使用してコンピューターに接続できます。 Dealextremeで安価なPALカメラUSBキャプチャカードを使用します。

 ffmpeg -r pal -s pal -f dshow -i video="USB2.0 ATV" -c:v libx264 -an -f flv "rtmp://1.2.3.4/live/test.flv live=1" 


画像

画面キャプチャ


2つのオプションがあります: FFSplitをインストールするか、FFmpegでscreen-capture-recorderを使用します
FFSplitは次の理由により使いやすい 便利なGUIがありますが、XP / 2003では機能しません。

2番目の方法を選択する場合、FFmpegの起動ラインは次のようになります。
 ffmpeg -f dshow -i video="screen-capture-recorder" -c:v libx264 -an -r 2 -f flv "rtmp://1.2.3.4/live/test.flv live=1" 

オーディオストリームは、virtual-audio-capturerでキャプチャできます。

画像
アプリケーションでの画面キャプチャの例

リレー


当然、FFmpegのビデオまたはオーディオファイル(またはストリーム)をサーバーに中継できます。 次の例では、リモートカメラからMJPEGビデオを送信します。
 ffmpeg -f mjpeg -i video="http://iiyudana.miemasu.net/nphMotionJpeg?Resolution=320x240&Quality=Standard" -c:v libx264 -f flv "rtmp://1.2.3.4/live/test.flv live=1" 

ただし、そのような目的のためには、RTMPサーバー自体でプッシュオプションを使用して中間リンクを除外し、サーバー自体でストリームをプルする方が合理的です。

画像
日本のある種のウェブカメラ

チューニング、問題解決



-プリセット名 H.264には、超高速、超高速、超高速、高速、高速、中、低速、低速、超低速の圧縮/速度比のセットがいくつかあります。 したがって、生産性を高めたい場合は、以下を使用する必要があります。
 -preset ultrafast 

-crf は、ビットレートと品質に直接影響します。 値は0〜51で、値が大きいほど画質が低下します。 デフォルトは23、18-ロスレス品質です。 CRFが6減少すると、ビットレートは約2倍になります。

-r numberは、入力および出力FPSを指定します。 画像のキャプチャ元のソースについては、代わりに-r -reを設定してネイティブFPSを使用できます。

-rtbufsize numberは、リアルタイムバッファーのサイズです。 バッファオーバーフローとフレームドロップに関するメッセージが常に表示される場合は、大きなバッファ(たとえば100000k)を配置できますが、これにより伝送遅延が増加する可能性があります。

-pix_fmtはカラーモデルを設定します。 画像の代わりに黒い四角が表示され、サウンドが機能する場合は、 yuv420pまたはyuv422pを インストールしてみてください。

-s入力および出力画像サイズのwidthxheight

-g number私が理解する限り、これはキー間の最大フレーム数です。 FPSが非常に小さい場合は、この値を低く設定して、ブロードキャスト開始の遅延を減らすことができます。

-keyint_min numberは、キーフレーム間のフレーム最小数です。

-vf "crop = w:h:x:y"ビデオのトリミング

-ゼロ遅延の 「マジック」オプションを調整して、ブロードキャスト遅延を減らします。 彼女が具体的に何をするか、私は見つけられなかった(-:

-analyzeduration 0は、継続時間分析を無効にします。これにより、ブロードキャストの待ち時間を短縮できます

上記のオーディオオプションに加えて、オーディオストリームがMP3 / AACへの追加の変換を必要としない場合、 -acodecコピーが必要になる場合があります。

例:音のない低遅延ウェブカメラからブロードキャストし、画像の上部に現在の時刻を描画します

 ffmpeg -r 25 -rtbufsize 1000000k -analyzeduration 0 -s vga -copyts -f dshow -i video="Webcam C170" -vf "drawtext=fontfile=verdana.ttf:fontcolor=yellow@0.8:fontsize=48:box=1:boxcolor=blue@0.8:text=%{localtime}" -s 320x240 -c:v libx264 -g 10 -keyint_min 1 -preset UltraFast -tune zerolatency -crf 25 -an -r 3 -f flv "rtmp://1.2.3.4:1935/live/b.flv live=1" 


サイト上のプレーヤー


ここではすべてが簡単です。 FlowplayerJW Playerなど、人気のあるプレーヤーの1つをサイトに配置します。

デモページでJW Player接続の例を見ることができます。

次は?


rtmpモジュールを使用すると、ビデオブロードキャストだけでなく、ビデオチャット、インターネットラジオ、ウェビナー用のシンプルなプラットフォームも作成できます。 がんばれ!

nginx-rtmp-moduleとffmpegの基本的な機能のみを考慮しました。 可能性ははるかに広いので、ドキュメントに注意してください。
Nginx-rtmp-moduleブログ
Wiki nginx-rtmp-module
FFmpegドキュメント
ストリーミングガイド
x264エンコーディングガイド
フィルタリングガイド

Source: https://habr.com/ru/post/J174089/


All Articles