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

Jetson-Nano中使用Gstreamer与OpenCV无法显示视频流

解决OpenCV+GStreamer读取RTSP流时imshow无法显示窗口的问题

核心问题与修复方案

1. 缺少GUI事件循环触发

OpenCV的imshow必须配合cv.waitKey()才能渲染窗口——这个函数负责处理GUI事件队列,没有它的话窗口无法正常显示。同时可以通过该函数设置退出逻辑,比如按下指定按键终止程序。

2. 优化GStreamer管道配置

给appsink添加必要属性,避免帧同步阻塞,同时明确指定输出格式匹配OpenCV的BGR要求,修改后的管道示例:

gst_pipeline = "rtspsrc location=rtsp://usser:pass@ip:port/url latency=0 ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! video/x-raw,format=BGR ! appsink sync=false"

3. 检查OpenCV编译依赖

确保你的OpenCV版本编译时启用了:

  • GStreamer支持(编译参数WITH_GSTREAMER=ON)
  • GUI后端支持(如WITH_QT=ON或WITH_GTK=ON)
    可以通过print(cv.getBuildInformation())查看编译配置,确认相关选项是否开启。

4. 完善循环逻辑

添加帧读取失败的判断,避免程序崩溃;退出循环后记得释放资源并销毁窗口。

修改后的完整代码

import cv2 as cv

# 优化后的GStreamer管道
gst_pipeline = "rtspsrc location=rtsp://usser:pass@ip:port/url latency=0 ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! video/x-raw,format=BGR ! appsink sync=false"
capture = cv.VideoCapture(gst_pipeline, cv.CAP_GSTREAMER)

print("Is pipeline open: ", capture.isOpened())  # 原代码存在拼写错误,正确为isOpened()

while capture.isOpened():
    ret, frame = capture.read()
    print("Is receiving frames: ", ret)
    if not ret:
        print("无法读取帧,退出循环")
        break
    
    cv.imshow("Stream", frame)
    # 等待1ms处理GUI事件,按下q键退出
    if cv.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
capture.release()
cv.destroyAllWindows()

额外说明

  • 原代码中capture.isopened()是拼写错误,正确写法为capture.isOpened()(驼峰命名)。
  • 警告Cannot query video position属于正常现象:RTSP流通常没有固定时长,不影响功能,可忽略。

内容的提问来源于stack exchange,提问作者Abner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:09:26