オンラインビデオとは何ですか?
オンラインビデオという用語で、ある種のライブビデオ信号の連続放送(テレビスタジオなどから)を理解しています。 この場合のビデオ出力の従来の手段(flvおよびmp4ストリーミング)は、単にビデオストリーム全体を含むファイルが存在しないために機能しません。
この記事では、ビデオホスティングの組織ではなく、ライブビデオブロードキャストの組織に焦点を当てます。 これらは根本的に異なる2つのタスクであり、通常、それらを解決する方法は互いに大きく異なります。
RTMPプロトコル
RTMP-リアルタイムメッセージングプロトコル( Wiki )-ライブビデオおよびオーディオコンテンツをクライアントに配信するために一般的に使用されるプロトコル。 AS3はすぐに使用できるので便利で、クライアントに多くのリソースを必要とせず、多くの利点をサポートします(たとえば、可変ビットレートでのブロードキャストや、空きチャネルがある場合のクライアントの高品質への切り替えなど)。
注意:RTMPに加えて、メディアストリームをブロードキャストするためのプロトコル(RTSP、Apple HTTP Live Streamingなど)がいくつかありますが、この記事では考慮していません。
RTMPプロトコルはAdobeの発案です。 RTMPストリームをブロードキャストできる唯一の公式サーバーは、Adobe Flash Media Serverです。 残念ながら、その価格と性能には多くの要望が残っているため、さまざまな開発者がプロトコルの多かれ少なかれ互換性のある代替実装を作成しようとしました。 残念ながら、RTMPプロトコルにはライセンスに関する既知の問題があります。たとえば、公式の仕様に厳密に従うと、動作するRTMPサーバーを作成できません。 ただし、いくつかの実装があります。
- Red5 -Javaで書かれた最初のRTMPサーバーの1つ
- Wowzaは、Javaで記述された独自のRTMPサーバーです。 RTMPに加えて、RTSP、Apple HLS、Smoothstreaming(Silverlight)もサポートしています。
- erlyvideoは、Erlangで記述された独自のモジュールを個別に配布した無料の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
利点:
- 非現実的な高速。 Wowzaテストに使用したのと同じ物理サーバー上で、nginxはコアあたり2500メガビットの接続に耐えました。 サーバー全体で10000。
- 便利な設定:)。 数キロメートルにわたるWowza XML構成の後、これらは救済のように見えます。
- クエストをフィーチャーするための著者の応答性。
短所:
- プロジェクトは若く、バグがありますが、すぐに修正されます。
- ほとんど機能しません。 サーバーはRTMPでのみブロードキャストし、トランスコーディングは数日前に登場し、実験的なステータスを持ち、実際にはffmpegのラッパーです。 UNIXのすべての栄光。
- マルチスレッドなし。 モジュールは、nginxが1つのワーカーで開始された場合にのみ機能します。 すべてのプロセッサコアを破棄するには、異なるIPアドレスやポートで複数のワーカーを実行する必要があります。
マルチスレッドは、この松葉杖(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のプロジェクト