繁体   English   中英

Stream h264 视频与 opencv+gstreamer 工件

[英]Stream h264 video with opencv+gstreamer artifacts

几个星期以来,我一直在尝试使用 opencv 和 gstreamer 通过网络 stream h264 视频,但我经常遇到问题。 我编写了一个简单的服务器,它从 web 相机或文件中捕获帧并通过网络发送。 以及拍摄视频的客户。

服务器.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

客户端.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


结果,我得到了一个带有伪影的错误视频。 实施1、2

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

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

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

这里有很多东西..

  1. UDP容易丢包。 因此,如果连接丢失或您阻塞接收线程太久,您将丢失数据。 数据不完整意味着图片损坏。

  2. 随机访问。 如果在 stream 已经运行时收到 stream,则您错过了正确解码 stream 的数据。 这只会在您收到同步点(I-Frame)后恢复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM