ホームページ  >  記事  >  運用・保守  >  nginx-rtmp-module モジュールに基づいて実装された HTTP-FLV ライブ ブロードキャスト モジュール nginx-http-flv-module を理解する方法

nginx-rtmp-module モジュールに基づいて実装された HTTP-FLV ライブ ブロードキャスト モジュール nginx-http-flv-module を理解する方法

坏嘻嘻
坏嘻嘻オリジナル
2018-09-17 10:08:473356ブラウズ

この記事の内容は、nginx-rtmp-module モジュールに基づいた HTTP-FLV ライブ ブロードキャスト モジュール nginx-http-flv-module を理解する方法に関するもので、これには特定の参照値があり、必要な友人はそれを参照できます。ご参考になれば幸いです。

現在、多くの個人やメーカーがこのモジュールの商品化を準備しています。ネチズンからのフィードバックによると、海外ではすでにこのモジュールを使用しているライブ放送ウェブサイトがあります。商用利用を準備している最も有名なメーカーはファーウェイであり、メーカーは修理後、機能がますます安定していることを報告しています。

2018-06-04: CDN メーカーが nginx-http-flv-module を正式にリリースしました。RTMP モードを使用し、gop_cache 構成をオンにしました (インターリーブ構成をオフにすると、遅延が発生します)または電源を入れても音が出ない)、現時点では修正方法がわかりません)、顧客には Inke と Weihou が含まれます。

2018-06-28: オンライン ビデオ メーカーが、gop_cache 構成を有効にせずに、HTTP-FLV メソッドを使用して nginx-http-flv-module を正式に開始しました。これはまだ完全にアクティブ化されていません。 、安定性を観察します。

2018-07-28: 一部のネチズンのニーズに応えて、RHEL6 (CentOS 6) および RHEL7 (CentOS 7) 用の rpm インストール パッケージが提供されました。nginx-http を参照してください。 -flv-モジュール -パッケージ。

nginx-http-flv-module と nginx-rtmp-module の機能比較:

###述べる### HTTP-FLV #xxxnginx-http-flv-module は HTTPS-FLV をサポートしますGOP キャッシュ√√ #xxxリッスン構成を省略します√ ###バツ### JSON スタイルの統計RTMP 302

2018-03-09 更新:

最近、モジュールの安定性は主にさまざまなプラットフォームでテストされていますが、現時点では、この部分の再生時に問題は見つかりませんでした。 Windows 7 以外はテストされていません。Nginx は公式には Windows をあまりサポートしておらず、Windows プラットフォームで最も強力な IOCP インターフェイスを使用していないため、Debian 7.x と macOS Sierra の両方がテストされています。使用されている)、Windows プラットフォームでの動作効率はあまり高くなく、プッシュ ストリーミングの待ち時間が 3 秒と長く、選択自体によりクライアントの数が制限されています。 、デフォルトは 1024 です。プッシュ ストリーミングの待機時間と最初の画面時間が最も短いのは macOS Sierra で、このマシンでテストしたところ、基本的に数秒以内にプッシュして開きました。昨夜、macOS Sierra でコンパイルする場合、SO_REUSEPORT と TCP_FASTOPEN の両方がサポートされており、前者は Nginx の各サブプロセスをリッスンできるようにし、後者の実際のデータの大量発生を解決します。ハンドシェイクが完了した後に実際のデータを送信するのではなく、SYN が開始されたときにすでに伝送されています。数秒で押して開くことは、これら 2 つのオプションに関連している可能性があります。ただし、macOS Sierra は CPU へのプロセスのバインドをサポートしていないため、プロセス コンテキストの切り替えにオーバーヘッドが発生する可能性があり、システム負荷が高い場合には Linux ほど効率が良くない可能性があります。 macOS Sierra は会社のコンピューターであるため、ストレス テストは実行されませんでした。私のラップトップには Debian 7.x がインストールされています。カーネルのバージョンが低いため、macOS Sierra でサポートされている 2 つのオプションはサポートされていません。テスト中のプッシュ待機時間と最初の画面時間は、サーバー (システム CentOS 6.4、SO_REUSEPORT をサポートするが TCP_FASTOPEN はサポートしない) でテストした場合、Windows 7 と macOS Sierra の間であり、サーバーの環境を考慮すると、macOS Sierra での時間と同様でした。 CPU パフォーマンスがはるかに強力であるため、macOS Sierra は負荷が高くないときに最高のパフォーマンスを発揮します。 macOS Sierra は Mac OS X からアップデートされており、Mac OS X の最下層は元々 FreeBSD をベースに開発されているため、FreeBSD 上でのパフォーマンスも良好であると推測されます。

また、最近、RTMP 302 リダイレクトをサポートしていないプレーヤーが多いため、RTMP 302 リダイレクトをサポートする機能が標準で追加されています。サポートされました。現時点では機能はほぼ完成しているのですが、厄介なのはHTTPフレームワークの送信インターフェースを使用すると、長時間再生するとリンクリストがループしてしまうため、進行が続行できず未完成であることです。 githubに更新しました。以下は、nginx のメイン rtmp 設定スニペットと VLC 再生中の HTTP 302 リダイレクトのスクリーンショットです。プッシュ ストリームは hls という名前のアプリケーションにプッシュされます (FFmpeg は RTMP 302 リダイレクトをサポートしていないため、hls にのみプッシュできます)。

アプリケーション myapp {

'^/myapp/(.*)' '/hsl/$1' を書き換えます;

}

1.HTTP 302リダイレクション パケット キャプチャの概要図

nginx-rtmp-module モジュールに基づいて実装された HTTP-FLV ライブ ブロードキャスト モジュール nginx-http-flv-module を理解する方法

2. HTTP 302 リダイレクション パケット キャプチャの詳細図

nginx-rtmp-module モジュールに基づいて実装された HTTP-FLV ライブ ブロードキャスト モジュール nginx-http-flv-module を理解する方法

##2018-03-15 更新:

一部のネチズンは、デバッグ後、追加された ngx_http_flv_live モジュールの順序に問題があるため、on_play コマンドが使用できないと報告しました。現在は、変更せずにいくつかのステータス変更を介してそれを回避するように修正されています。モジュールの順序を変更し、後でこれらの関数の一部を呼び出して、関数が元の nginx-rtmp-module と一致していることを確認します。

2018-03-16 更新:

一部のネットユーザーによって提案された CORS (クロスドメイン) 機能が利用可能になりました。HTTP-FLV 応答データはハードコーディングを使用せず、一部を使用します。 HTTP のフレームワーク コードが書き直されました。さらに、on_connect 関数に問題があり、一時的に使用できなくなり、修復を待っています。

2018-03-18 更新:

on_connect の問題が修正されました。

2018-03-20更新:

検索対象のアプリケーションが最初のサーバーブロックに存在しないため、対応するon_connectとon_playが見つからない不具合を修正しました。正しいサーバー構成と一致しないためでした。修正されました。

2018-03-22 更新:

昔、一部のネチズンは、idle_streams がオフに設定されている場合 (デフォルトはオン)、HTTP-FLV を使用してプルを再生すると提案しました。これは修正されました。

2018-03-25 更新:

一部のネチズンは flv.js を使用して nginx-http-flv-module によってプルされたライブ ストリームを再生し、バグを発見しました: (1) Nginx が使用バージョン番号は1.13.9、(2) プレーヤーはflv.js、(3) プルストリームを再生する際、再生されません。調べたところ、flv.jsがHTTPヘッダー「Connection:」を送信しているためです。 keep-alive" では、nginx-http-flv-module がアップストリームへのリクエストを開始すると、通常、アップストリーム リクエストが返される前にダウンストリーム リクエストが返されます。ただし、Nginx はバージョン 1.13.1 以降、r->blocked 判定を削除しました。 「接続: keep-alive」により、ngx_http_finalize_request が ngx_http_set_keepalive を呼び出します。この関数は、登録されたクリーンアップ関数を呼び出してダウンストリーム リクエストを閉じ、再生が失敗します。すでに修正されています。このバグのデバッグの過程で、

nginx-http-flv-module が gop_cache 構成項目をオンにすると、flv.js が他の主流プレーヤー (vlc など) とは異なることがわかりました。 ) 比較すると、最初の表示時間は遅延がほとんどなく最速です。使用されるプル ソースは香港衛星テレビのライブ ブロードキャスト ソースです: rtmp://live.hkstv.hk.lxdns.com/live/hks## #。

2018-03-27 更新:

コードを一部変更したところバグが発生し、非常に迷惑です。最近、一部のネットユーザーからのカスタマイズされた HTTP ヘッダーの追加機能のリクエストに応えて、送信機能を修正して、Nginx の HTTP フレームワークのフィルター インターフェイスを導入しようとしましたが、それでも失敗したため、単純かつ大雑把に抽出しました。最後のフィルター モジュールと header_filter モジュールを削除しました。 Nginx の公式安定バージョンである nginx-1.12.2 は、github でのコンパイルに使用されます。その結果、一部のネチズンは今日、コンパイルできなかったと報告しました。確認したところ、私が nginx-rtmp-module を修正して以来使用している nginx-1.11.10 に、見つからなかったマクロが追加されていたことが判明しました。 、ネチズンが使用するバージョンが低かっただけでコンパイルできませんでしたが、修正されました。

2018-03-29 更新:

数日前、一部のネチズンは、nginx-1.13.1 以降のバージョンを使用して nginx-http-flv-module でコンパイルする場合、次のように報告しました。 flv.js はプル ストリームの再生に失敗します。2018 年 3 月 25 日のアップデートを参照してください。この問題は、最初にストリームをプッシュしてから再生する際にも発生します。この問題は簡単に修正できます。Nginx の最新バージョンと少し古いバージョン (nginx-1.11.10) がテストされています。

2018-04-05 の記録:

今回は更新ではありません:) 昨日、一部のネチズンが、flv.js を使用してプッシュ ストリームを再生すると再生できないと報告しました。 nginx-http-flv - モジュールにまた問題があると思いました。私はそれを自分でテストし、最新の nginx-1.13.10 でコンパイルしました。プッシュおよびプル ストリームの再生には問題ありませんでした。また、公式の安定版でもコンパイルしました。 nginx-1.12.2 をインストールしても問題はありませんでしたが、夕方に何が問題になったかを確認する準備をしていたときに、あるネチズンが、テストによると、ブラウザーが flv.js の数を制限していると報告しました。 1 つのブラウザでは 6 つの flv.js しか開くことができませんでした。今日の正午に Firefox を使用してテストしましたが、その後、7 つ目の flv.js を再生できませんでした。このことから、nginx-http-flv-module に問題がないことが確認できます。ただし、これは非常に重要な情報です。flv.js の再生をサポートするブラウザの数には制限があり、Chrome と Firefox は両方とも 6 に制限されています。他のブラウザはテストされていません。

2018-04-06更新:

以前の統計データにはhttp-flvライブブロードキャストの受理件数と出力が含まれていませんでしたが、追加されました。 flv.js のサポートが安定しました。以下は、flv.js を使用して再生するスクリーンショットです。

nginx-rtmp-module モジュールに基づいて実装された HTTP-FLV ライブ ブロードキャスト モジュール nginx-http-flv-module を理解する方法

ある商用メーカーは、ビデオ ソースが純粋な場合にこの問題を報告しました。どのような再生方法を使用してもビデオの再生接続には問題ありませんが、デバッグの結果、純粋なオーディオの判定ロジックにバグがあることが判明し、nginx- が発生しました。 http-flv-module がオーディオおよびビデオ データを送信するインターフェースで無限ループする問題を修正しました。

2018-04-14 更新:

昨日、一部のネチズンが、gop_cache オプションがオンになっていると、プッシュ ストリーミングによってメモリ リークが発生することが判明したと報告しました。プッシュフローがオフになっているときに解放されない問題は、メモリが原因で修正されました。また、ネットユーザーからのフィードバックによると、マルチプロセス モードの on_connect および on_play コマンドに問題があるため、修正されるまで当面はこれら 2 つのコマンドをマルチプロセス モードで使用しないでください。

2018-04-15 更新:

ある商用メーカーは、ランダム フラッシュ テスト中にメモリが増加し続けると報告し、デバッグ中にメモリ リークが発生した可能性があると報告しました。夜に実際にメモリリークが発生していることを確認しました。原因は ngx_http_request_t 構造体のメモリプールが解放されていないことによるもので、修正されました。

2018-04-21 更新:

一部のネチズンは、マルチプロセス モードでは認証操作に on_play が使用されるが、プッシュ時にはローカル リレー (受け付けるサブプロセス) が使用されると報告しました。プッシュ (他の子プロセスにストリームをプッシュする) によって、on_play 認証も実行されますが、認証は以前に実行されているため、これは不合理です (ただし、実際にはバグではありません)。 nginx-http-flv-module はローカル リレーの on_play 操作を削除しましたが、on_play が何に使用されるかは関係ありませんが、ローカル リレーが on_play 操作を実行しないことを考慮すると、変更されたコードは比較的単純であり、回復は簡単です。簡単なので、一時的にこのように変更します。さらに、netizen @qqzzzx によって報告されたストレス テストのクラッシュの問題は部分的に修正されました。残りの問題は、ストレス テスト グループが切断された後にメモリ リークが発生することです。修正後は github に更新されます。

2018-04-25 更新:

ストレス テストのクラッシュ問題が修正され、過剰な CPU 使用率の可能性がある問題も解決されました。ストレス テストは 1 回以上行われました。時間 (srs -Bench 独自のテスト ビデオ、500 HTTP-FLV および 200 RTMP)、まだ問題は見つかっていません。バグの報告を歓迎します。

2018-05-12 更新:

一部のネチズンは、gop_cache オプションをオンにすると、場合によってはストレス テストで大量のメモリを消費する可能性があると報告しました。メモリ リークがあるかどうかはわかりません。ストレステストは何度も再現できないとネチズンは、ストレステストツールとサーバーが同じホスト上にない場合は再現しやすいと指摘した。確かに、この方法でストレス テストを再現するのは簡単ですが、メモリ消費量が比較的大きい場合は、ストレス テストを停止してから再度ストレス テストを実行しても、メモリの同時実行数は増加しません。メモリリークの問題ではないことを確認します。ソースコードを何度も確認した結果、GOP を送信するときに GOP データが一度に送信リング配列に入れられたため、Nginx は非同期でノンブロッキングであるため、実際にはリング配列からネットワークにデータを送信していないのではないかと推測しました。 (たとえば、サーバーとクライアント間のネットワーク帯域幅が不十分な場合)、割り当てられたメモリはすぐに再利用できず、GOP が実際に送信された後、割り当てられたメモリは (メモリ プール内で) 解放されなくなります。接続とは関係がなく、構成構造のみが関係します)。後続のデータ送信は一度に送信される GOP データとは異なり、リサイクルされたメモリを完全には使用できず、大部分がアイドル状態になります。次に、独自の独立したメモリ プールを使用するように gop キャッシュ モジュールを変更し、GOP の送信後にこのメモリ プールを解放します。

2018-05-14 更新:

2018-05-12 更新で導入されたメモリ リークのバグを修正しました。コードは長い間理解できず、すぐに問題が発生しました。条件nginx-rtmp-module モジュールに基づいて実装された HTTP-FLV ライブ ブロードキャスト モジュール nginx-http-flv-module を理解する方法が変更されました。高いバージョンの gcc コンパイル プロジェクトが失敗するバグを修正しました (オンラインで確認しました。gcc-7.x.x は、特定のコンパイル オプションを追加するときにスイッチ ケースが失敗したかどうかをチェックします) が、非常に高いバージョンの gcc を持っていません。そのため、まだ発見されていないコンパイルエラーがいくつかある可能性があり、現在ネチズンからの返信を待っています。

2018-05-16 更新:

日中、gcc-7.2.0 をコンパイルしてインストールしたところ、コンパイルのフォールスルー警告 (Nginx コンパイルのエラーとみなされます) がすべて見つかりました。オプション)。バグが修正されました。

2018-05-18 の記録:

これは更新ではありません。2018 年 5 月 12 日の更新では、ストレス テスト中に gop_cache オプションをオンにすることが特殊になると思います。 (使用したツールは srs-bench です) 今夜ログを確認したところ、前回の推測が主な原因ではないことがわかりました。ログから、chunk_size 設定項目が設定で指定されていない場合、つまり、サーバーが Set Chunk Size プロトコル制御メッセージを送信した後、Nginx は常に 128 バイトのデータを受信することがわかります。 、クライアント クライアントが Set Chunk Size プロトコル制御メッセージに応答しなかったため、サーバーは以前の 128 バイトを使用し続け、最悪の場合、nginx-http-flv-module がパッケージ化するためにメモリを割り当てます。 128 バイトのデータをパックするために非常に多くのバイトの領域 (4096 RTMP ヘッダーの最大サイズ) を使用すると、32 倍のデータが無駄になります。比較テストには ffmpeg を使用します。ffmpeg は Set Chunk Size プロトコル制御メッセージに応答するため、メモリの無駄が発生しません。 SRS (Simple-RTMP-Server) の作成者に問題が送信されました。時間があるときに、nginx-http-flv-module によるこの例外の処理を更新します。

2018-05-20 更新:

一部のケースで特にメモリ消費が発生する問題は修正されました。消費量がまだ非常に多い場合は、前述の 2 番目の理由が原因である可能性があります。上記の原因。

2018-06-14 更新:

ネットユーザーから報告された、一定期間実行した後の ngx_stat_active パラメーターの値が正しくないことが原因であることが判明した問題を修正しました。減算演算が繰り返される問題は修正されており、通常の関数の使用には影響しません。

2018-06-19 に更新:

nginx-rtmp-module のいくつかのプル リクエストのバグ修正を同期しました。基本的に、それらは大きな修正はありません。さらに、fmp4 を直接プッシュする機能が nginx-http-flv-module に追加されました。今夜、MSE (Media Source Extensions、現在 iOS の Safari ではサポートされていません) をサポートするブラウザに純粋なビデオ fmp4 を直接プッシュする機能が実装されました。 ) を再生すると、音声が後で追加されます。

2018-06-25更新:

fmp4をプッシュする基本機能はほぼ完成しました。一部のネチズンが JSON 形式で stat をサポートする PR をプッシュしました。私が試してみたところ、小さなバグも修正されました。

2018-06-29 更新:

2 つのメーカーが RTMP を正式に商用化した (gop_cache をオンにする) という事実を考慮して、stat 内の元の rtmp 情報を http-flv に変更します。 HTTP-FLV (gop_cache が有効になっていない場合)、マイルストーン バージョン 1.2.4 がリリースされました。

2018-07-09 更新:

3 つの小さなバグを修正しました。DASH 機能をオンにすると、ファイルから読み取られたデータが 0 であるために無限ループが発生する可能性があり、XML を修復しました。メソッド nginx-http-flv-module のバージョン番号が統計に表示されない問題 (ネット民からの PR); HEAD リクエストが flv_live の場所を設定していない場合に 405 (メソッドが許可されていません) を返すバグを修正#

Function nginx-http-flv-モジュール nginx-rtmp-モジュール
#xxx vhost

###バツ###
###ベータ### #xxx nginx-http-flv-module をサーバーまたはクライアントとして使用する

以上がnginx-rtmp-module モジュールに基づいて実装された HTTP-FLV ライブ ブロードキャスト モジュール nginx-http-flv-module を理解する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。