我正在尝试使用以下方法获取GStreamer + OpenCV RTSP视频捕获:
vcap = cv2.VideoCapture("""rtspsrc location=rtsp://192.168.100.60:554/stream1 latency=0 ! queue ! rtph264depay
! h264parse ! avdec_h264 ! videoconvert ! appsink""", cv2.CAP_GSTREAMER)
while True:
ret, frame = vcap.read()
print(frame)
cv2.imshow('VIDEO', frame)
cv2.waitKey(1)但是,vcap读取的帧是None。
(<unknown>:79564): GLib-GObject-WARNING **: 00:27:54.660: invalid cast from 'GstQueue' to 'GstBin'
(<unknown>:79564): GStreamer-CRITICAL **: 00:27:54.660: gst_bin_iterate_elements: assertion 'GST_IS_BIN (bin)' failed
(<unknown>:79564): GStreamer-CRITICAL **: 00:27:54.660: gst_iterator_next: assertion 'it != NULL' failed
(<unknown>:79564): GStreamer-CRITICAL **: 00:27:54.660: gst_iterator_free: assertion 'it != NULL' failed
[ WARN:0@0.020] global /tmp/opencv-20220409-60041-xvxfur/opencv-4.5.5/modules/videoio/src/cap_gstreamer.cpp (1226) open OpenCV | GStreamer warning: cannot find appsink in manual pipeline
[ WARN:0@0.020] global /tmp/opencv-20220409-60041-xvxfur/opencv-4.5.5/modules/videoio/src/cap_gstreamer.cpp (862) isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created
None
Traceback (most recent call last):
File "/Volumes/Data/Projects/rtmp_test/src/test.py", line 21, in <module>
read(1)
File "/Volumes/Data/Projects/rtmp_test/src/test.py", line 18, in read
cv2.imshow('VIDEO', frame)
cv2.error: OpenCV(4.5.5) /tmp/opencv-20220409-60041-xvxfur/opencv-4.5.5/modules/highgui/src/window.cpp:1000: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'imshow'流可以在VLC中很好地播放,并且gst-launch-1.0 rtspsrc location=rtsp://192.168.100.60:554/stream1 latency=0 ! queue ! rtph264depay! h264parse ! avdec_h264 ! videoconvert ! appsink提供规则的输出。有人知道可能出了什么问题吗?
更新:我注意到这个问题只发生在OSX上。它在我的Ubuntu机器上运行得很好。
发布于 2022-04-09 19:09:57
在追加接收器之前,您可以尝试将上限指定为视频格式BGR (或单色GRAY8 ),因为这是大多数来自OpenCV的默认格式(也可能简化引用),例如:
gst_pipeline='rtspsrc location=rtsp://192.168.100.60:554/stream1 latency=0 ! queue ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! video/x-raw,format=BGR ! appsink drop=1'
vcap = cv2.VideoCapture(gst_pipeline, cv2.CAP_GSTREAMER)还请注意,在循环中的终端中打印每个帧可能会根据您的用例和平台防止在预期的框架下运行。
https://stackoverflow.com/questions/71805134
复制相似问题