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エンコーディングガイド

フィルタリングガイド



All Articles