背景介绍:我正在使用gstreamer(1.8.2版)连接来自IP摄像头的rtsp视频流并将其馈送到opencv(3.1版)。视频流为 640x480,10fps。网址如下:
rtsp://192.168.0.200:554/1/h264minor
当我使用 gst-launch 测试视频流时,延迟非常低~300ms。命令如下。我很确定“延迟=0”是实现这种低延迟的最重要因素。
gst-launch-1.0 -v rtspsrc location=rtsp://192.168.0.200:554/1/h264minor latency=0 ! decodebin ! autovideosink
在opencv中,当我使用下面的代码打开rtsp流时,延迟非常大~2.35s。通过这种方式,我了解 gstreamer 将使用默认延迟自动设置管道。
VideoCapture cap;
cap.open("rtsp://192.168.0.200:554/1/h264minor")
在研究了 opencv - cap_gstreamer.cpp 中的代码后,我发现我们可以为 gstreamer 设置一个手动管道,它与我用于 gst-launch 的管道相似。这样,我可以控制延迟设置。所以我改变了我的代码如下。根据 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,我知道这还不够。不过,我想从 opencv/gstreamer 专家那里得到一些指导。欢迎任何提示/建议。提前致谢!