无法从OpenCV Gstreamer接收gstreamer UDP流

我正在研究使用“ Gstreamer插件”通过UDP流传输摄像机视频的Gazebo Sim。在Ubuntu 18.04上开始仿真。

有一些资源可以了解此构造函数的后端。 Gazebo Simulation PX4 Guide

他们提到了如何创建管道:

  

然后,从凉亭观看的视频应与之前一样在QGroundControl中显示   会从真正的相机拍摄。

     

也可以使用Gstreamer管道观看视频。   只需输入以下终端命令:

gst-launch-1.0  -v udpsrc port=5600 caps='application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264' \
! rtph264depay ! avdec_h264 ! videoconvert ! autovideosink fps-update-interval=1000 sync=false

它在终端上运行良好。我读了这些问题:

using gstreamer with python opencv to capture live stream?

Write in Gstreamer pipeline from opencv in python

因此,我尝试通过使用以下几行在opencv中实现此管道:

video = cv2.VideoCapture('udpsrc port=5600 caps = "application/x-rtp,encoding-name=(string)H264" ! rtph264depay ! avdec_h264 ! videoconvert ! autovideosink fps-update-interval=1000 sync=false',cv2.CAP_GSTREAMER)
    #video.set(cv2.CAP_PROP_BUFFERSIZE,3)
    # Exit if video not opened.
    if not video.isOpened():
        print("Could not open video")
        sys.exit()

    # Read first frame.
    ok,frame = video.read()
    if not ok:
        print('Cannot read video file')
        sys.exit()

但这只是错误:

无法打开视频

我在opencv中尝试了该管道的不同变体,但没有一个能帮助我。

fangchufeng 回答:无法从OpenCV Gstreamer接收gstreamer UDP流

当前,您的管道无法为OpenCV提供从管道中提取解码视频帧的方法。这是因为所有帧都移至最后的autovideosink元素,该元素负责在屏幕上显示这些帧。相反,您应该使用appsink元素,该元素专门用于允许应用程序从管道接收视频帧。

video = cv2.VideoCapture(
    'udpsrc port=5600 caps = "application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264"'
    ' ! rtph264depay'
    ' ! avdec_h264'
    ' ! videoconvert'
    ' ! appsink',cv2.CAP_GSTREAMER)
,

以下代码正常运行:

# Read video
video = cv2.VideoCapture("udpsrc port=5600 ! application/x-rtp,payload=96,encoding-name=H264 ! rtpjitterbuffer mode=1 ! rtph264depay ! h264parse ! decodebin ! videoconvert ! appsink",cv2.CAP_GSTREAMER);

我认为解码选项不正确。

本文链接:https://www.f2er.com/3138294.html

大家都在问