You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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()

修改说明

  1. 端口修正:将端口从5004改为5005,与发送端、终端测试命令保持一致
  2. 管道重构:移除fpsdisplaysink,直接将rtpvrawdepay输出的UYVY格式视频,经videoconvert转换为OpenCV支持的BGR格式后接入appsink;设置drop=1和sync=0避免帧堆积与延迟
  3. Caps参数完善:补充RTP标准时钟率(90000)、编码类型(RAW)、动态payload类型(96),修正参数格式中的空格问题
  4. 循环逻辑修复:移除错误的else分支,保持循环持续读取帧,直到读取失败或用户主动退出

额外验证步骤

  • 确保FPGA端脚本中的$HOST_IP设置为PC的正确以太网IP,$MTU建议设置为1400(适配以太网传输)
  • 先通过终端命令确认流正常后,再运行Python脚本

内容的提问来源于stack exchange,提问作者minami-kotori

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 19:23:13