12

HTML5ビデオタグで表示できるWebカメラストリームをエンコードする最速の方法を探しています。ハードウェアにPandaboard を使用しています: http://www.digikey.com/product-highlights/us/en/texas-instruments-pandaboard/686#tabs-2。gstreamer、cvlc、ffmpeg を使用できます。これを使用してロボットを操作するので、ビデオ ストリームの遅延を最小限に抑える必要があります。品質は優れている必要はなく、オーディオも必要ありません。また、これは 1 つのクライアント専用であるため、帯域幅は問題になりません。これまでの最善の解決策は、mpjpeg で ffmpeg を使用すると、約 1 秒の遅延が発生することです。もっと良いものはありますか?

4

2 に答える 2

24

私はこれを何度も尋ねられたので、mjpeg だけでなく、少し一般的に答えようとします。システムの遅延を非常に小さくするには、システム エンジニアリングの努力とコンポーネントの理解が必要です。

私が考えることができるいくつかの単純なトップレベルの調整は次のとおりです。

遅延が最小になるようにコーデックが設定されていることを確認します。コーデックには (特に組み込みシステム コーデック) 低遅延構成があります。有効にします。H.264 を使用している場合は、最も便利です。ほとんどの人は、標準要件により、H.264 デコーダーがフレームを表示する前にバッファーする必要があることを認識していません。これは、Qcif では最大 16 フレーム、720p では最大 5 フレームです。これは、最初のフレームを取得する際の大幅な遅延です。H.264 を使用しない場合でも、B ピクチャが有効になっていないことを確認してください。これにより、最初の画像を取得するのに遅延が追加されます。

mjpegを使っているのであまり当てはまらないと思います。

エンコーダーには、レート制御の遅延もあります。(init delay または vbv buf size と呼ばれます)。許容できる品質が得られる最小の値に設定してください。これで遅延も減ります。これは、エンコーダーとデコーダーの間のビットストリーム バッファーと考えてください。x264 を使用している場合、それが vbv バッファー サイズになります。

いくつかの簡単なその他の構成: できるだけ少ない I ピクチャを使用します (大きなイントラ期間)。I 画像は巨大であり、ネットワーク経由で送信するのに遅延が発生します。これは、エンド ツー エンドの遅延が 1 秒以上の範囲にあるシステムではあまり目立たないかもしれませんが、100 ミリ秒以下のエンド ツー エンドの遅延が必要なシステムを設計している場合、これと他のいくつかの側面が関係します。また、低遅延のオーディオ コーデック aac-lc (heaac ではなく) を使用していることを確認してください。

あなたのケースでは、待ち時間を短縮するには、mjpeg から離れて、少なくとも B 画像なしで mpeg4 (シンプルなプロファイル) を使用するか、H.264 ベースライン プロファイル (x264 はゼロ待ち時間オプションを提供します) を使用することをお勧めします。レイテンシが低くなる単純な理由は、データを送信するポスト エンコーディングのビットレートが低くなり、フル フレームレートにできるからです。mjpeg に固執する必要がある場合は、オープン ソース コンポーネントをそのまま使用するコーデックとシステムからのより高度な機能のサポートなしで取得できるものに近いものがあります。

別の態様は、表示ユニットへのコンテンツの送信である。udp を使用できる場合、tcp に比べてレイテンシが大幅に短縮されますが、ネットワークの状態によっては損失が発生する場合があります。あなたはhtml5ビデオについて言及しました。HTML5 ビデオ タグへのライブ ストリーミングをどのように行っているのか知りたいです。

他にも微調整できる側面があり、それらは高度なカテゴリに分類され、システム エンジニアがさまざまなことを試す必要があります。

OS のネットワーク バッファリングとは何ですか? また、OS は、パフォーマンス上の理由から、データを送信する前にバッファリングします。これを微調整して、パフォーマンスと速度のバランスをとってください。

CR または VBR エンコーディングを使用していますか? CBR は低ジッタに最適ですが、コーデックが提供する場合はキャップ付き vbr を使用することもできます。

デコーダーは部分フレームのデコードを開始できますか? そのため、デコーダーにデータを提供する前に、データのフレーミングについて心配する必要はありません。できるだけ早くデータをデコーダーにプッシュし続けてください。

フィールドエンコーディングはできますか?フレームのエンコードから最初の画像を取得するまでの時間を半分にします。

スライスをネットワーク経由ですぐに送信できる場合はいつでも、コールバックを使用してスライス エンコーディングを実行できますか?

100 ミリ秒未満のレイテンシーでは、上記のすべてで使用したシステムが使用されています。一部の機能はオープン ソース コンポーネントでは利用できない場合がありますが、本当に必要で熱心な場合は、先に進んで実装することができます。

編集: ipad ストリーミング ソリューションでは上記の多くのことを行うことはできず、達成できる遅延にも hls が原因で制限があることを認識しています。しかし、低遅延システムが必要な場合に役立つことを願っています。

于 2012-08-23T05:58:00.650 に答える
3

同様の問題がありました。私たちの場合、外部イベントの時間を計測し、それらをビデオ ストリームと同期する必要がありました。いくつかの解決策を試しましたが、ここで説明する解決策は問題を解決し、レイテンシが非常に低くなっています。

Github リンク

gstreamerトランスコードを使用して mjpeg に変換し、それを小さな Python ストリーミング サーバーに送信します。これには、代わりにタグを使用するという利点があるため、iPhone を含む最新のほとんどのブラウザーで表示できます。

<video> タグが必要なため、簡単な解決策は http-launch を使用することです。これは、私たちが試したすべてのソリューションの中で最もレイテンシが低かったため、うまくいく可能性があります. ogg/theora は Safari や IE では動作しないことに注意してください。そのため、Mac や Windows をターゲットにしたい場合は、MP4 または WebM を使用するようにパイプを変更する必要があります。

有望に見える別のソリューション、 gst-streaming-server 。追求する価値のある十分なドキュメントを見つけることができませんでした。誰かがそれをどのように使用すべきかについてスタックオーバーフローの質問をすることができれば、私は感謝しています!

于 2014-05-16T14:20:52.893 に答える