背景の紹介: gstreamer (バージョン 1.8.2) を使用して、IP カメラからの rtsp ビデオ ストリームを接続し、それを opencv (バージョン 3.1) にフィードします。ビデオ ストリームは 10fps で 640x480 です。URLは以下のとおりです。
rtsp://192.168.0.200:554/1/h264minor
gst-launch を使用してビデオ ストリームをテストすると、レイテンシーは 300 ミリ秒まで非常に低くなります。以下のようにコマンドします。この低レイテンシを実現するには、「レイテンシ = 0」が最も重要な要素であると確信しています。
gst-launch-1.0 -v rtspsrc location=rtsp://192.168.0.200:554/1/h264minor latency=0 ! decodebin ! autovideosink
opencv で、以下のコードを使用して rtsp ストリームを開くと、レイテンシが 2.35 秒と非常に大きくなります。このように、gstreamer はデフォルトのレイテンシーでパイプラインを自動的にセットアップすることを理解しています。
VideoCapture cap;
cap.open("rtsp://192.168.0.200:554/1/h264minor")
opencv - cap_gstreamer.cpp のコードを調べたところ、gst-launch で使用したものと同様の gstreamer 用の手動パイプラインをセットアップできることがわかりました。このようにして、レイテンシ設定を制御できます。そこで、コードを以下のように変更しました。cap_gstreamer.cpp のコメントによると、appsink の名前は「appsink0」または「opencvsink」である可能性があります。しかし、常にこのパイプラインのセットアップに失敗し、ビデオ ストリームを取得できません。
VideoCapture cap;
cap.open("rtspsrc location=rtsp://192.168.0.200:554/1/h264minor latency=0 ! decodebin ! appsink name = appsink0")`
エラーメッセージは次のとおりです。
GStreamer プラグイン: 埋め込みビデオの再生が停止しました。モジュール udpsrc1 が報告しました: 内部データ フロー エラー。OpenCV エラー: cvCaptureFromCAM_GStreamer、ファイル /opencv-3.1.0/modules/videoio/src/cap_gstreamer.cpp、行 826 で不明なエラー (GStreamer: パイプラインを開始できません)
私の質問は:
- opencvでrtspストリームを取得するための適切なgstreamerパイプラインは何ですか?
- またはopencvからgstreamerに「レイテンシ」パラメータを渡す代替方法はありますか?
opencv が gstreamer をどのように利用しているかを理解するために 4 日間を費やしましたが、それだけでは不十分であることはわかっています。ただし、opencv/gstreamer の専門家からガイドを入手したいと思います。ヒント/提案は大歓迎です。前もって感謝します!