背景介绍:我正在使用gstreamer(版本1.8.2)连接来自IP摄像机的rtsp视频流并将其提供给opencv(版本3.1) . 视频流为640x480,10fps . 网址如下: rtsp://192.168.0.200:554/1/h264minor

当我使用gst-launch测试视频流时,延迟非常低~300ms . 命令如下 . 我很确定"latency=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中研究了代码之后,我发现我们可以为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中的未指定错误(GStreamer:无法启动管道),文件/opencv-3.1.0/modules/videoio/src/cap_gstreamer.cpp,第826行

我的问题是:

  • 在opencv中获取rtsp流的正确gstreamer管道是什么?

  • 或将"latency"参数从opencv传递给gstreamer的任何替代方法?

我花了四天时间来了解opencv如何使用gstreamer,我知道这还不够 . 但是,我想从opencv / gstreamer专家那里获得一些指导 . 欢迎任何提示/建议 . 提前致谢!