nginxを使用してオンラインビデオをブロードキャストする

オンラインビデオとは何ですか?



オンラインビデオという用語で、ある種のライブビデオ信号の連続放送(テレビスタジオなどから)を理解しています。 この場合のビデオ出力の従来の手段(flvおよびmp4ストリーミング)は、単にビデオストリーム全体を含むファイルが存在しないために機能しません。



この記事では、ビデオホスティングの組織ではなく、ライブビデオブロードキャストの組織に焦点を当てます。 これらは根本的に異なる2つのタスクであり、通常、それらを解決する方法は互いに大きく異なります。



RTMPプロトコル



RTMP-リアルタイムメッセージングプロトコル( Wiki )-ライブビデオおよびオーディオコンテンツをクライアントに配信するために一般的に使用されるプロトコル。 AS3はすぐに使用できるので便利で、クライアントに多くのリソースを必要とせず、多くの利点をサポートします(たとえば、可変ビットレートでのブロードキャストや、空きチャネルがある場合のクライアントの高品質への切り替えなど)。



注意:RTMPに加えて、メディアストリームをブロードキャストするためのプロトコル(RTSP、Apple HTTP Live Streamingなど)がいくつかありますが、この記事では考慮していません。




RTMPプロトコルはAdobeの発案です。 RTMPストリームをブロードキャストできる唯一の公式サーバーは、Adobe Flash Media Serverです。 残念ながら、その価格と性能には多くの要望が残っているため、さまざまな開発者がプロ​​トコルの多かれ少なかれ互換性のある代替実装を作成しようとしました。 残念ながら、RTMPプロトコルにはライセンスに関する既知の問題があります。たとえば、公式の仕様に厳密に従うと、動作するRTMPサーバーを作成できません。 ただし、いくつかの実装があります。







Javaは遅くなります



私が実施したテストでは、Red5とWowzaのパフォーマンスは明らかに劣っていました。 メガビットのビデオストリームでは、オンラインで1000人の視聴者を持つWowzaがプロセッサ時間の約300%を消費しました(Intel Xeon E5607)。 少なくとも20,000人をオンラインでブロードキャストする場合、20台のサーバーを購入する必要がありますか? 高すぎる。



どうする?



ノンブロッキング操作を使用します。 WowzaとRed5のブレーキは、最適なイベント処理スキームとはほど遠いために続きます。 非常に高速なストリーミングサーバーを実装するには、効果的なイベント処理方法を使用する必要があります(Linuxの場合はepollです)。 これはまさに、Roman Harutyunyan( ブログgithubプロファイルrarutyunyan )がRTMPサーバーに実装し、nginxのモジュールとして実装した作業スキームです。



nginx-rtmp-module



利点:





短所:





マルチスレッドは、この松葉杖(Ubuntu)のようなものを使用して実装できます。



for ip in $(cat /etc/network/interfaces | grep address | awk '{print $2}') ; do touch /etc/nginx/nginx.$ip.conf cp /etc/nginx/nginx.conf.skel /etc/nginx/nginx.$ip.conf sed -i "s/%IPADDR%/${ip}/g" /etc/nginx/nginx.$ip.conf /usr/sbin/nginx -c /etc/nginx/nginx.$ip.conf done
      
      







この場合、IPアドレスではなく、%IPADDR%を示す構成のスケルトンを記述しておく必要があります。 たとえば、これ:

 worker_processes 1; error_log logs/error.%IPADDR%.log debug; pid /var/run/nginx.%IPADDR%.pid; worker_rlimit_nofile 65536; events { worker_connections 16384; } rtmp { server { listen %IPADDR%:1935; chunk_size 4000; application live { live on; pull live stream %masterIP%; } } } http { server { listen %IPADDR%:8080; location /stat { rtmp_stat all; rtmp_stat_stylesheet stat.xsl; } location /stat.xsl { root /srv/nginx/html; } } }
      
      







ただし、著者は将来のリリースで通常のマルチスレッドを実装することを約束しています。



nginx-rtmp-moduleを使用して、10ギガビットチャネルを完全に利用することができました。 同時に、主な問題はnginx自体の大食いではなく、ソフトウェア割り込みがCPUの100%を消費しないようにネットワークカードとカーネルパラメータを調整する必要性でした。



関連リンク:



ウィキペディアのRTMP

Wowza-公式サイト

Erlyvideo-公式サイト

Nginx-rtmp-module-GitHubのプロジェクト



All Articles