使用opencv+gstreamer工件流式播放h264视频

2024-09-28 17:16:33 发布

您现在位置:Python中文网/ 问答频道 /正文

几周来,我一直试图使用opencv和gstreamer在网络上传输h264视频,但我经常遇到问题。我编写了一个简单的服务器,从网络摄像机或文件中捕获帧并通过网络发送。还有拍摄视频的客户

Server.py

import cv2

PIPELINE = 'appsrc ! videoconvert ! x264enc tune=zerolatency speed-preset=fast ! rtph264pay ! udpsink host=192.168.0.171 port=5004'
cap_send = cv2.VideoCapture(0)
frame_size = (1280, 720)
out_send = cv2.VideoWriter(PIPELINE, cv2.CAP_GSTREAMER, 0, 16, frame_size, True)    

while True:
    ret, frame = cap_send.read()
    frame = cv2.resize(frame, frame_size)
    out_send.write(frame)
    cv2.imshow('send', frame)
    if cv2.waitKey(1) == 27:
        break

Client.py

import cv2

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

while True:
    ret, frame = cap_receive.read()
    cv2.imshow('receive', frame)
    if cv2.waitKey(1) == 27:
        break


结果,我得到了一个有瑕疵的视频。示例12

在控制台中,我还收到一个错误: cv::GStreamerCapture::open OpenCV | GStreamer warning: Cannot query video position: status=1, value=3, duration=-1

有什么问题?我应该指出一些额外的参数吗?还是我的安装错误? 我试图设置各种参数synk,比特率,速度预设等,但总是得到残废的视频

我还注意到,如果您先尝试Client.py,然后尝试Server.py,我会得到一个正常的视频,过一段时间后,视频也会失真


Tags: pyimport网络sendtruesize视频pipeline
1条回答
网友
1楼 · 发布于 2024-09-28 17:16:33

这里有很多东西

  1. UDP容易丢失数据包。因此,如果连接有损或您阻塞接收线程的时间过长,您将丢失数据。不完整的数据意味着图片被破坏

  2. 随机存取。如果在流已经运行时接收到流,则会丢失正确解码流的数据。只有在收到同步点(I帧)后,才会恢复

相关问题 更多 >