nginxのベースのメディアサーバ技術 - オープンクラスオンライン

オープンソース・ストリームメディアサーバーのnginx-RTMPモジュールのより多くの国内の適用は困難と他の問題の少ない機能、大規模なクラスタがありました。LiveVideoStackではオンライン、PingOSオープンソースプロジェクトチームの開発エンジニアで共有に、UCloud RTC R&Dエンジニア朱Jianpingは、HTTP-FLVでPingOSストリーミングメディアサーバーのnginxの-RTMP・モジュールに基づいて詳細に紹介し、HTTP-TS、HLS +、マルチプロセス、リツイート、ソースと技術的な実装の詳細のクラスタ化された展開にバック。

温家宝/朱Jianping

仕上げ/ LiveVideoStack

ライブプレイバックhttps://www2.tutormeetplus.com/v2/render/playback?mode=playback&token=006643cdea15499d96f19ab676924e88

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

1. nginxの拡張をストリーミング:HTTP-FLV、HTTP-TS、HLS +

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

実質的に同一(消費者のプロデューサー、n個)を含むメディアサーバSRSストリーミング含むほとんどのモデルと関連する最もオリジナルのnginx-RTMPモジュール。nginxの問題を保つ:それは単にRTMPの消費モデルを作ったあなたはHTTP-FLV形式またはhttp-TSを拡大したい場合は、より困難になります。、生産のすべての生産者と消費者が同じストリームにマウントされます:あなたが最初に私たちはその基礎となる分布モデルを(上に示した)を理解するために必要なすべてのは、http-FLVを展開したい場合は、RTMPセッションは、RTMPプロトコルを使用しているのでネットワークからデータを受信するための責任者、それはバッファからデータを取得するために、消費者に送信します。

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

サーバは、RTMPセッションを作成するために、HTTPリクエストを受信したときに、FLV送信データ場合、原稿が、RTMPセッションを保持することができ、このセッションは、ネットワーク、唯一の論理的セッションに関連付けられていません。セッションは、その後、消費者の役割に基づいている場合、それらの流れの中に注入される流れに注入、あなたは、データへのアクセスを実現して配布することができます。この時点で、サーバーがHTTP-FLVの要求を受信した場合は、その後、理論的には、我々が得ることができるRTMPデータであり、論理的にセッションを作成し、ストリームに注入することができます。私たちが必要とすることにより、RTMPデータとの類似性のためにデータFLV、FLVのデータである。しかし、我々は、タグ・ヘッダ方式を通じてFLVデータをRTMPするデータを復元することは非常に簡単にすることができます。上記の考え方によると、生産者と消費者モデルでは、消費者は、以前の配布プロセスを再利用することができて、http-偽のセッションのフォームを作成することにより、HTTP-FLV契約を満たしました。関連のHTTPクライアントは、生産者が意志生産者へのダウンロードにリモートサーバからのデータを渡すための責任があるの後に我々は、HTTPクライアントの関連付けのhttp-偽のセッションをプロデューサーとしてのhttp-偽のセッションを作成し、できるようにそれらを拡張しますこれらのデータは、RTMPセッション、次の配信モデルを介して配布することができます。また、これは間接的機能は、httpソースを返します。私たちは、上記のアイデアを素早くHTTP-FLVプレーヤーとプルの流れを実現することができます。同様に、我々は、上記の考え方に基づいて契約を拡大し続けることができます。我々は(ないネットワークに関連するロジックのセッション、)は、HTTPと同様のRTMP-偽のセッションを作成するための要求を受信した後、我々は消費者の役割にそれを置く場合は、それらのストリームに挿入されます。これは、下方に分散される必要があるデータのストリームから得ることができます。注こと:ストリームのRTMPは、最初はデータではなく、データTSを格納され、TSが直接データを取得することはできません。

nginxので実装1.1 HTTP-FLV

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

nginxのに基づいて次の詳細は、HTTP-FLV達成注意:まず、分布モデルとnginxのHTTPモジュールを多重化の実現。事業のいくつかの行で(HTTP1.0、HTTP1.1プロトコルを含むHTTPプロトコルスタック用nginxのサポート、より完璧な、)、顧客はあなたがHTTP-FLVファイルをダウンロードする際に、過去の慣行に従って、接尾辞を追加する必要があり、我々はそのロジックコードになりますフィルタ接尾。あなたは、このような変化は、HTTPチャンクエンコーディングを開くために必要があるかどうかなど、より複雑な要件を満たしている場合、我々は唯一のコードを変更することができます。それはHTTPベースで既存のモジュールの再利用nginxのHTTP-FLVを達成することであるならば、我々はnginxの-HTTP-書き換え機能により、これらの操作を実装することができるようになります。したがって、本来の機能を使用するには、nginxの-HTTPを大幅にコードの量を減らすなどのより多くの利益をもたらすことができるのhttp-FLVを開発します。

ここで私は1つのケースを見てきました:RTMPを多重化するHTTPモジュール、ない配布プロセスを再利用しています。これは、我々は再び再実行し、それに対してHTTP-FLVファイルを配布する必要があるプロセスは、ビジネスの制御が非常に複雑になりますが発生します。

それは、この時点で再生することが要求された場合、サービスのサーバーにメッセージを通知する必要があります。RTMPおよびHTTPは、FLV 2つのプロトコルが分離されている達成場合は、この時点では、それは両方がトリガーされた場合、それらは業務サーバへのレポートに必要とされることを意味します。だから我々は間違いなく大幅に開発コストとメンテナンスコストを増加させる二重のコードのロジック保守作業を、支払う必要があります。したがって、最も簡単な解決策は、RTMPのFLVのみがマークされたデータを配布する必要がある一方で、データにする場合にのみRTMP RTMP形式の配布を送信する同等の場合にのみ、次の問題は、フォーマット変換をFLV無治療関連の事業を実施しないことですタグ・ヘッダをFLV、そして次に発行、従ってビジネス層の開発の必要性を排除します。

HTTP-FLVプレイヤー実現

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

RTMP RTMPのキャッシュとのhttp-FLVが両方のプロトコルをサポートすることを図に示します。HTTP-FLVとRTMP共有キャッシュ、実際には、FLV RTMPデータ伝送自体は、どちらも捨てるためのタグのヘッダです。

:HTTP-FLVが発行され、発行され、異なる送信機能であるRTMP唯一の違いポイントされ、次のそれぞれを追加するために作られた前に、HTTP-FLVコールが送信機能ですhttpを発行したRTMPは、ネイティブの送信機能があるときに呼び出さプロトコル・ヘッダ。共有メモリは、両方の節約メモリ効果を得ることができ、かつ均一なトラフィックを達成するために、開発コストを削減します。

実現のソースへのhttp-のFLVバック

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

図に示すのnginxの実現にソースへのhttp-のFLVバックいます。ソースへのHTTP-FLVの思考バックは、http-FLVプレイヤー同様のアイデアの実現を達成するために:ローカルHTTPには、httpクライアント物事はダウンロードデータにしたソースへの必要性の後ろにあるHTTPクライアントを作成します。RTMPの偽のセッションを作成するために、ローカルのHTTPクライアントのニーズに、それらの流れに注入プロデューサーとしてデータをダウンロードする前に。HTTPクライアントは、インターネットからのダウンロードデータに始まり、データにFIV RTMPデータ分割にダウンロード。なぜ、RTMPデータに分割?キャッシュされたデータRTMPプラグフロー型RTMPが来るので、これはキャッシュにそのデータに分割されたFLV、RTMP分割を行うとする必要があるため、インターネットからデータをダウンロードして、です。最終的な実際のデータの要求にまたはRTMP FLVフォーマット。このように、ロジックのRTMP偽のセッションでのhttp-FLVプレーヤーに応じて、迅速にHTTP-FLVのソースに動作バックを実現することができるようになります。

1.2 HTTP-tsがnginxの中で実装されています

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

図に示すnginxのでは実現はHTTP-TSいます。その実装やアイデアの実現基本的にHTTPは-のFLVのhttp-tsが別々のバッファキャッシュを必要とすることを除いて、運転中だけ異なる、同じ。差分HTTP-TSとFLVをRTMPするデータのためのHTTP-FLV大きなデータ形式ので、データは、個片に分割する必要があり、前にヘッダを付加します。でも、ほとんどの一つまたはデータのブロックが満たされていないFLV不足しています。

しかし、異なるデータTS、各ブロックは、ヘッダとペイロード部TSを含む188バイトでなければならないことをより厳格な要件。データベースのサイズが未満188バイトであれば、あなたが満たされなければなりません。RTMP厳密に固定されたデータ・ブロック・サイズは、その長さを必要としないが。Tsのデータのために、FLVのTSデータへの注文データは、このプロセスは、計算の一部を消費する必要があります。大きな違いというのFLV TSデータとデータ形式ので、ので、ここで我々は、バッファのTSとバッファが開いて完全に独立したRTMPです。しかし、これはデフォルトで有効になっていない、あなたはサーバに設定する必要があります。

開いた構成後、バッファはTSミラーリングデータを生成RTMPとなり、データのこの部分のみHTTP-TS及びHLS 2つのプロトコルのためであろうtsは。サーバーはまた、我々は変更を加えませんでしたが、追加HLSは、+サービスは、このバッファを使用するネイティブサービスHLS、に関するものです。TSまたはHLS +は、彼らは彼らの偽のセッションを登録しているかどうか、そうすることの目的は、業務を統一することです。遊びを入力するための要求があった場合、例えば、我々は、サーバーが要求がある現在のビジネスを知っている必要があります。

このネットワークは、開発の過程では、通知、イベント通知インタフェースに似ている私たちだけではなく、HLSが遊ぶための通知を書き込むためのHLS契約を行うと言っよりも、ビジネスデータを書き込むために、すべてしたいが、また、契約には、tsのtsの書き込みを行うために通知には、そのコードを維持するために、ほとんどのハードサービスにつながる、巨大なビジネスになります。

したがってfakesession効果は、サービス層とネットワーク層が完全に分離される、非常に大きいです。サーバー自体は、プロトコルを発行した場合でも、サービスサーバへのRTMPセッションをすることができ、RTMP作成し、マウントされていません。全体的に、達成するためのHTTP-FLVとの唯一の違いは、バッファの異なる位置を取得することですのhttp-TS。HTTP-FLVの必要性は、http-TSは、内のバッファTSから取得され、RTMPバッファから取得します。あなたはHTTP-FLVの合意プロセスを理解することができれば、http-TSの実装プロセスを理解することは難しいことではありません。

nginxの+ 1.3 HLSがで実装されて

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

HLS + nginxのが実装されている図2に示されています。HLS HLS +異なる伝統、サーバー側での伝統的なHLSがない状態で、サーバーは、データの大規模な番号が含まれ、クライアントはダウンロードを実行し続けますが、HLSは+各クライアントのステータスが記録されます。私は、レコードの状態に使用される仮想接続を作成するために、HLS +に接続しようとする前に、各クライアントの状態を記録する方法については。しかし、我々は、ビジネスをより複雑になることを発見し、後者は、コード、バグやメンテナンス費用の金額など、多くの問題を、持っています。その後、他の方法を交換、または方法の偽のセッションを使用しました。次いで、各着信HTTPに従った、偽のセッションを使用して接続し、消費者へのバインドセッションIDとして。

接続は、セッションIDを取得していない場合、クライアントは第一セッションIDをHLS送信要求をサーバに知られていないので、クライアントが最初の時間を入力するように考えられています。クライアントは、セッションIDを含む新しいアドレスにクライアントを教えてくれます302、302応答の返信を受信します。セッションID、要求M3U8は再び、セッションIDに参加します取得するには、クライアントの後、サーバーは区別するために、対応するセッションIDとクライアントIDを取得することができます。このセッションIDは、各クライアントのプレイ状況によって記録することができます。なぜ、この状態を記録?サーバが難しいことではありませんので、これは主であるが、データがメモリに直接書き込まれ、それは各ユーザーを知っている必要があり、各クライアントのダウンロードの進捗状況やスケジュールに応じて、メモリからのTSデータを配置します。

そして、HLS +のhttp-TSは、彼らがバッファを共有tsは、バッファからのリアルタイムポジショニングHLS + TSコンテンツ。だから、HLS +、TSなし実際のデータ生成が、メモリ内のコードのオフセットを各ファイルのレコードのために。ハードディスクは、読み取りと書き込みのボトルネック - 前したがってHLS + HLSサービスをやっても問題の読み書きは、ありませんが、あなたは、問題が発生することがあります。機械的なハードディスクの読み取りと書き込み速度が比較的遅く、一般的な考え方は、仮想ハードディスクをマウント解決することであるが、メモリは読み書きするディレクトリにマッピングされました。

操作を実装する必要性を減らす+プログラムHLS、もし、だけでなく、メモリとあまり消費のために。同時に需要とHLS +のhttp-tsが存在する場合や、メモリ使用率のため、この時間は非常に高いです。

2.静的プッシュプル流れ

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

静的クラスタのニーズを満たすために、主に流れをスライドさせます。単一のサーバが同時実行性の高いサービスをサポートするには不十分であるならば、我々は、サーバーのスケーラビリティを考慮する必要があります。ユーザーは全国に散らばっている場合また、また、我々は、サーバー間で開く必要があります。事業は次のように複雑されていない場合しかし、あなたは、静的なプッシュプル・フローを使用することもできますよう。

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

静的プッシュプル構成のストリーミングサービスは、最初の静的プル全く見てのストリームを、上記に示した:ターゲットソース局の存在を最初に、ソースに静的バックを使用している場合は、宛先アドレスが送信元局が変更することができるターゲットコンフィギュレーションファイルに設定されています。

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

図に示す単純な静的プルフローモデル:データは、アンカーからプッシュされている場合、我々はアドレスサーバAが変化しないことを確認する必要があり、ソースステーションAに流れます。

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

あなたは完全なストリーミングメディアシステムを構築したい場合はまた、あなたは静的および静的なプッシュプル・ストリームの流れを含める必要があります。観客は、サーバCの要求に再生されている場合、サーバは、サーバ、サーバAにストリームCを引っ張ってくるに関係なく、ビデオがAストリームがあるかどうかの、Cは、サーバを引き出します。したがって、このモデルは、単純なビジネスシナリオに適用されます。

3.動的制御:ソースへのダイナミックバック、動的なプッシュスイッチ、認証

「ノーブレイン」プッシュとプルスライドフロー静的フローとは対照的に、ほとんどの人々のニーズに適してプッシュプルダイナミックなフローです。

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

各関数のnginxののRTMPサービスは、トリガーの異なる段階で行われます。トリガを演奏誰かが始まるがメッセージを再生するとき、例をoclp_playメッセージを再生するには、startパラメータを運びます。

再生中に、メッセージがトリガされます再生するが、今回は更新パラメータを運ぶでしょう。劇の最後にパラメータによって運ばプレイメッセージは、ダウンしているトリガされます。これらのパラメータにより、我々は、特定のビジネスサーバー要求を再生するには、ステージへの通知と再生を実現することができます。

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

ソースに3.1動的バック

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

同じ3つの段階、メインアプリケーションの遊びに分割し、認証動作を発行され、プラグフローを公開する、同様のプラグフロー処理動作があります。スタートフェーズた場合、サーバは、ビジネスの結果または非404 200を返し、サーバーは真の公開、現在の再生要求を中断します。また、プルおよびプッシュプルは、主に動的フローステージで使用されています。サーバが遊びに要求を受信して​​、存在しないストリームをパブリッシュする現在のサーバーの客観流れ、存在しないことが判明した場合、それはステージ引きの開始をトリガします。サーバは、結果302を返す場所と新しいアドレスまたはhttp-FLVのRTMPアドレスを書いた場合は、サービス開始要求を送信した後、このサーバーは、RTMPストリームまたはFIVを引っ張っていることターゲットサーバをマークしますストリームは、このプロセスは、動的に引かストリームと呼ばれています。

3.2ダイナミックリツイート

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

実質的に同じフローダイナミックプル方式が理解される動的プラグフローを、対応する動的ストリームを引きます。サーバーにストリームをプッシュする場合は、サーバが構成されたターゲットアドレスを開始する要求を送信します。あなたが返される結果に新しいアドレスを追加する場合、メディアサーバ間でのRTMP操作する動的な栓流で新しいアドレスへのRTMPストリームをプッシュします。これは、流れが中断され、すべての前提は302の結果を返すことですされ、ストリームを起動したくない場合は、その後、戻ってサーバ400へ、または他の非200。

道路をストリームに姿を消したときにのみ作成がトリガされると、比較的小さいとOclp_stream。遊びや公開、またはプレイを公開のいずれかがある場合にのみ、この方法は、ライフサイクルの流れが終わっていないと思うだろう、と道路を流れのライフサイクルが終了した同定された前の2が消えたときのみ。

ストリームが解除されていない場合は同様に、この時点でしか初めて誰かの要求を介してすべての方法は、トリガスタートとみなされ、流路が作成されますが、それはプロデューサーではありません。このアプリケーション・シナリオでは、ビジネス要件は、このメッセージを使用する場合があり、比較的高いシステムであるだけに、比較的小さいです。

![](データ:画像/ SVG + XML、UTF8、<SVGのxmlns =」http://www.w3.org/2000/svg '幅=' 1080'の高さ= '608'> </ SVG>)

図に示すIPのクエリサーバー、舞台のサポートを参照してくださいしたいとクエリサーバーのoperating'dなどの構成例、。

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

クラスタの展開依存事業(スケジューリング)サーバー、ビジネスはサーバエッジサーバBに送信元アドレスが含まれている302個のアドレスを、教えてくれるとき、oclp_hold段階でのサーバビジネスを照会するために、エッジサーバBようにソースへの需要バックがあれば。エッジサーバーBは、ソースへの動的なバックを達成するために、ストリームをプルするタグテーブル(メディアサーバーA)から出てきます。

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

ダイナミックリツイートは主に局所的な流れに押し出さ。CDNでは、異なる機能を担う異なるクラスタにサービスを提供しています。例えば、記録を担当するいくつかのクラスターは、いくつかは、我々はトランスコードするこれらのコアのマシンのニーズを置くことができると思っていたり、適切なクラスタに転送オンデマンドでストリーミングを記録したい、この時のトランスコーディングのための唯一の責任があります。サービスのこれらの異なるタイプが含まれている場合、動的リツイートは非常に重要な、あなたはダイナミックリツイートを達成するために、構成oclp_pushを追加する必要があります。

3.3認証

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

認証動作は、我々は唯一の公開または認証のために再生されます。

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

フィードバックは200を再生させるとプレイは、403フィードバックをプレイするために許可されていない場合場合は、サービス要求を許可することができるかどうか、顧客サービスサーバーコントロールによって、あまりにも、公開します。

フロントエンドプレイがまたはパブリッシュされた場合、どのようにトークンが持ち込まれた認証?

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

すべてのカスタムパラメータの引数= K = V&pargsコマンド= $ pargsコマンド外向きにプレイクエリを送信している間、それはのRTMPことができるように、引数= K = V&pargsコマンド= $ pargsコマンド追加した場合、これらのパラメータの再送要求をもたらす:主変数で渡りました。

4.マルチプロセス:ソースへのプロセス間のバック

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

ネイティブRTMP nginxのに多くのマルチプロセスの問題のバグがありますが、実際には、共有メモリーレコードを通じてダウン各プロセス流のリストになりました。プレイは、ターゲットフロープロセスへのソースに、UNIXソケットとプルバックによる処理、クエリストリームのリストを、流れていない場合。また、ソースへのプロセス間バックはocl_playoclp_publish oclp_pullメッセージをトリガしません。

詳細な手順

雨滴:https://github.com/im-pingo/pingos

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

[サンプルムービー]大規模なオンライン共有やインタラクティブなライブオンラインビデオのユーザーエクスペリエンスの最適化の実践

突然の流行、オンライン教育、ビデオ会議に伴われ、インタラクティブなライブオンラインビデオのニーズがコンセントに低いユーザーのレイテンシのライブビデオ視聴体験をより明確に滑らかにし、提供することが、どのように大規模で、非常に同時ビデオニーズをもたらしましたか?ユーザー体験と教育効果を最適化するために、オンライン学習教育用ホワイトボード機能を付与する方法?ユーザーエクスペリエンスを強化するために、インタラクティブなビデオをオンラインビデオでユーザーの関心を刺激するには?

3月29日の19:00に、手UCloud RTCチーフアーキテクト王LifeiでLiveVideoStack手、基盤となる技術インフラストラクチャと大規模なインタラクティブなライブオンラインビデオの背後を探るために、王暁シニアアーキテクト趙文傑、マイルマイルシニアR&Dエンジニア唐6月-ラインビープビープ音を学び、思考およびユーザーエクスペリエンスの最適化のプラクティスを共有しています。

  • 「練習URTC最適万人の人々も、ジミー・ライブ」王Lifei UCloud RTCチーフアーキテクト
  • 「最適化をオンライン/オフラインにホワイトボード技術の教育」趙文傑は王暁シニアアーキテクトを学び、思考
  • 「高エネルギーバー:インタラクティブなビデオ体験の最適化、」唐6月ラインビープ音マイルマイルシニアR&Dエンジニア

オープンクラスインレット予約:

大規模なインタラクティブなライブオンラインビデオとユーザーエクスペリエンスの最適化の練習-LiveVideoStack&UCANオープンレッスン21 mudu.tv

nginxのベースのメディアサーバ技術 - オープンクラスオンライン

おすすめ

転載: blog.51cto.com/13832960/2481846