使用opencv + gstreamer工件流h264视频

时间:2020-06-20 02:37:55

标签: python opencv gstreamer

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

Server.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


Client.py

cv::GStreamerCapture::open OpenCV | GStreamer warning: Cannot query video position: status=1, value=3, duration=-1

结果,我得到了一个带有伪像的越野车视频。示例12

也在控制台中出现错误: App = Application.currentApplication(); App.includeStandardAdditions = true; function run(documents) { documents.forEach(filepath => App.write( App.read(filepath) .split('\n') .map(line=>"\t"+line) .join('\n'), { 'to': filepath } )); return App.displayNotification( 'Done', { 'withTitle' : 'Indent Contents of File' } ); }

出什么问题了?我应该指出一些其他参数吗?还是我的安装错误? 我尝试设置各种参数synk,比特率,速度预设等,但始终会显示残缺的视频。

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

1 个答案:

答案 0 :(得分:0)

这里有很多东西。

  1. UDP容易丢失数据包。因此,如果连接丢失或阻塞接收线程的时间太长,则会丢失数据。数据不完整意味着图片破裂。

  2. 随机访问。如果流正在运行时收到流,则会丢失数据以正确解码该流。只有在您收到同步点(I帧)后,这种情况才会恢复。

相关问题