如何用OpenCV/Python接收GStreamer UDP视频流?
解决OpenCV/Python接收GStreamer以太网视频流的问题
问题根源分析
你的代码存在几个关键错误,导致无法正常接收视频流:
- 端口不匹配:终端命令使用5005端口,但Python代码中写的是5004,直接导致接收不到数据
- GStreamer管道逻辑错误:
fpsdisplaysink是终端显示专用元素,不会向下游传递数据,不能和appsink串联 - 循环逻辑错误:原代码中
if ret:的else分支会直接终止循环,导致仅读取一帧就退出 - Caps参数格式问题:原caps中
height=(string )多了空格,且缺少RTP流必要的参数(如时钟率、payload类型)
修正后的代码
import cv2 # 重构后的GStreamer管道 gstreamer_str = '''udpsrc port=5005 caps="application/x-rtp, media=video, clock-rate=90000, encoding-name=RAW, sampling=YCbCr-4:2:2, depth=8, width=1920, height=1080, payload=96" ! \ rtpvrawdepay ! \ video/x-raw, format=UYVY ! \ videoconvert ! \ video/x-raw, format=BGR ! \ appsink drop=1 sync=0''' cap = cv2.VideoCapture(gstreamer_str, cv2.CAP_GSTREAMER) if not cap.isOpened(): print("无法打开视频流") exit() while True: ret, frame = cap.read() if not ret: print("读取帧失败") break cv2.imshow("Input via Gstreamer", frame) # 按q键退出 if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
修改说明
- 端口修正:将端口从5004改为5005,与发送端、终端测试命令保持一致
- 管道重构:移除
fpsdisplaysink,直接将rtpvrawdepay输出的UYVY格式视频,经videoconvert转换为OpenCV支持的BGR格式后接入appsink;设置drop=1和sync=0避免帧堆积与延迟 - Caps参数完善:补充RTP标准时钟率(90000)、编码类型(RAW)、动态payload类型(96),修正参数格式中的空格问题
- 循环逻辑修复:移除错误的else分支,保持循环持续读取帧,直到读取失败或用户主动退出
额外验证步骤
- 确保FPGA端脚本中的
$HOST_IP设置为PC的正确以太网IP,$MTU建议设置为1400(适配以太网传输) - 先通过终端命令确认流正常后,再运行Python脚本
内容的提问来源于stack exchange,提问作者minami-kotori
相关产品推荐
相关产品推荐

