使用Python+OpenCV向GStreamer shmsink推流未生成文件问题求助
问题原因及解决方法
核心原因1:帧格式不匹配,缺少格式转换环节
OpenCV通过cv2.VideoCapture读取的默认帧格式是BGR8(3通道8位无符号整数),但你的GStreamer流水线中appsrc的输出caps直接声明为YUY2,两种格式不匹配,流水线协商直接失败,根本没有成功启动,自然不会生成/tmp/blah文件。
核心原因2:appsrc缺少必要配置属性
OpenCV对接GStreamer的appsrc时,需要明确指定appsrc的必填属性,比如is-live=true、do-timestamp=true,否则appsrc不会正常推送数据,流水线无法进入运行状态。
核心原因3:GStreamer流水线字符串语法错误
你写的GStreamer字符串里对caps的双引号转义、多余空格会导致解析失败,实际上不需要额外给caps加引号,直接写即可。
其他可能原因:OpenCV未开启GStreamer编译支持
如果你的OpenCV是系统源默认安装的,部分发行版的预编译OpenCV没有开启GStreamer后端支持,可以运行以下命令验证:
import cv2 print(cv2.getBuildInformation())
搜索输出中的GStreamer条目,确认状态为YES。
修复后的代码示例
import time import cv2 fps = 30. frame_width = 320 frame_height = 240 cap = cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FRAME_WIDTH, frame_width) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, frame_height) cap.set(cv2.CAP_PROP_FPS, fps) # 修复后的GStreamer流水线:先匹配OpenCV输出的BGR格式,转换为YUY2后再送shmsink gst_str = "appsrc is-live=true do-timestamp=true ! video/x-raw,format=BGR,width=320,height=240,framerate=30/1 ! videoconvert ! video/x-raw,format=YUY2,color-matrix=sdtv,chroma-site=mpeg2 ! shmsink socket-path=/tmp/blah shm-size=2000000" # 创建VideoWriter后先判断是否打开成功 out = cv2.VideoWriter(gst_str, cv2.CAP_GSTREAMER, fps, (frame_width, frame_height), True) if not out.isOpened(): print("VideoWriter打开失败,请检查GStreamer流水线配置和OpenCV编译选项") exit(-1) while True: ret, frame = cap.read() if ret: out.write(frame) cv2.imshow("Frame", frame) if cv2.waitKey(1) & 0xFF == ord('q'): break else: print("Camera error.") time.sleep(10) cap.release() out.release() cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者rpi_guru
相关产品推荐
相关产品推荐

