2017-11-14 6 views
-2

における++ OpenCVのアプリケーションCからのストリーミング - などHTML5、のWebRTC、低遅延ビデオがありトピックに関する質問のかなり多くがありますが、それらのほとんどは望ましくないプロトコルの使用を伴うWINDOWS

基本的には、問題どのように私は自分のcv :: Mat画像をRTSPまたはMJPEG [リアルタイムのストリーミングのためにAFAIK]にストリームするのですかWindows?私が見つけることができるほとんどすべては、LinuxであるOSに依存しており、プロジェクトにはあてはまらないだけです。

FFMPEGのパイプライン処理は機能しましたが、遅延は約10秒でした。検討中のプロジェクトがアクティブユーザの監視アプリケーションであるため、十分に長いパラメータリストを使用して3〜4秒に短縮できますが、それは十分ではありませんカメラを制御するので、私は可能な限りリアルタイムに近づける必要があります。

もう1つの問題は、オブジェクトの追跡アルゴリズムですでに過負荷になっているため、解決策はコア全体を食べるべきではないということです。

ありがとうございました!

EDITffmpeg -re -an -f mjpeg -i http://..addr.../video.mjpg -vcodec libx264 -tune zerolatency -f rtp rtp://127.0.0.1:1234 -sdp_file stream.sdp - 私は、任意の前処理なしで直接ストリームを再変換するために使用され、それがローカルホストに遅延の約4秒が得られたコマンド。

答えて

1

まず、待ち時間がどこから来ているかを知る必要があります。

  1. ビデオキャプチャ
  2. エンコーディング
  3. 伝送
  4. デコード(プレーヤー)

あなたがローカルホストから測定しているので、我々はできる:

は、待ち時間の4つの要因の基本があります送信を0秒とみなします。ビデオの解像度とフレームレートがあまり高くない場合、デコード時間もゼロに近くなります。

ここでは、キャプチャとエンコーディングの最初の2つに焦点を当てる必要があります。

ここで問題となるのは、libx264はソフトウェアエンコーダです。したがって、CPUパワーを使用し、画像が最初に作成されるGPUメモリではなく、主メモリ内のデータを必要とします。

したがって、FFMPEGがフレームをキャプチャすると、ビデオメモリからメインメモリにOSのレイヤーを渡す必要があります。

libx264を使用する場合、残念ながら3秒または2秒以上の結果は得られません。

Nvidia Captureソリューションをお勧めします。 https://developer.nvidia.com/capture-sdk

使用可能なGPUを使用している場合は、バックフレームまたはイントラフレームバッファからGPUに直接各フレームをキャプチャしてエンコードすることができます。あなたはあなたが好きなようにそれを送信するためにffmpegを使用することができます。

+0

残念ながら、私が使用しているシングルボードPCには、個別のGPUグラフィックスはありません。 –

関連する問題