我在gstreamer中使用v4l2sink来查看我可以在OpenCV中访问的视频流。当我打开视频捕获设备并获得帧时,这是有效的,但是在某些时候,我想释放捕获设备并在程序稍后重新打开它。当我释放设备时,我得到以下错误:
[ WARN:7] global /tmp/build_opencv/opencv/modules/videoio/src/cap_gstreamer.cpp (488) isPipelinePlaying OpenCV | GStreamer warning: unable to query pipeline state
[ WARN:7] global /tmp/build_opencv/opencv/modules/videoio/src/cap_gstreamer.cpp (1761) handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Failed to allocate a buffer
我像这样打开捕获设备:
cap = cv2.VideoCapture("v4l2src device=/dev/video3 ! nvvidconv ! video/x-raw(memory:NVMM) ! nvvidconv ! video/x-raw,format=BGRx ! videoconvert ! video/x-raw,format=BGR ! appsink drop=1 max-buffers=2")
像使用cap.release()
一样释放它我的gstreamer管道是:
"gst-launch-1.0 v4l2src device=/dev/video2 ! video/x-raw,format=YUY2,width=2560,height=720,framerate=60/1 ! tee name=t ! queue ! xvimagesink sync=0 brightness=50 t. ! queue ! v4l2sink device=/dev/video3"
我使用以下命令创建v4l2loopback设备:
sudo modprobe v4l2loopback video_nr=3 max_buffers=2
我必须指定max_buffers=2,因为我面临着与这篇文章相同的问题:Gstreamer v4l2src在Jetson Nano上运行时未能分配缓冲区,在开始时我得到了分配缓冲区失败的错误。
当我尝试重新打开管道并捕获设备时,主要问题出现了,因为gstreamer给了我一个没有协商错误的理由。
不确定您的情况,但我会尝试在v4l2sink之前添加identity drop-allocation=1
,用于v4l2loopback节点:
gst-launch-1.0 v4l2src device=/dev/video2 ! video/x-raw,format=YUY2,width=2560,height=720,framerate=60/1 ! tee name=t ! queue ! xvimagesink sync=0 brightness=50 t. ! queue ! identity drop-allocation=1 ! v4l2sink device=/dev/video3