[英]OpenCV VideoCapture says video has 0 frames (C++ and Python)
[英]Grey Video frames when using OpenCV Videocapture with GStreamer C++
嘿,我是 Gstreamer 的新手,想通过 a.network 将从摄像机捕获并使用 OpenCV 处理的视频发送到接收部分。 然后接收部分读取它并显示它。 这应实时完成。 它基本上适用于下面的代码/gstreamer 设置,但是一旦帧丢失(至少我认为这是原因),视频就会以灰色部分的形式损坏(附图)。
OpenCV 发送部分:
cv::VideoWriter videoTransmitter("appsrc ! videoconvert ! videoscale ! x264enc ! rtph264pay config-interval=1 pt=96 ! udpsink host=192.168.168.99 port=5000", cv::VideoWriter::fourcc('H', '2', '6', '4'), 10, videoTransmitter_imageSize, true);
OpenCV 接收部分:
cv::VideoCapture videoReceiver("udpsrc port=5000 ! application/x-rtp ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! videoconvert ! appsink", cv::CAP_GSTREAMER);
它基本上可以工作,但我经常在视频中看到灰色部分,然后停留一段时间直到视频正确显示。 我猜它总是在由于传输而丢失帧时发生。 但是,我怎样才能摆脱这些灰色/损坏的框架? 任何提示? 我需要设置任何 Gstreamer 参数来调整结果吗? 有没有更好的方法来 stream 与 opencv over.network 的视频?
任何帮助表示赞赏!
不,Gstreamer 中没有任何机制来检测损坏的帧,因为这没有意义。
在大多数现代视频编解码器中,帧不再完整发送,而是分成几片(意味着只有帧的一小部分)。 它可以采用多个内部数据包(每个数据包包含多个切片)来构建一个完整的帧,这是一件好事,因为它使您的 stream 对错误更具弹性,并允许对切片进行多线程解码(例如)。
为了实现你想要的,你有多种解决方案:
GOP - 1
帧来恢复(你必须解码它们,但你不能使用它们,它们可能已损坏),你需要一种检测错误的方法,请参见上面的第 1 点或第 2 点. 对于x264enc
,该参数称为key-int-max
。 您可能还想尝试intra-refresh=true
,这样错误时的破帧效果会更短。 缺点是相同视频质量的带宽增加。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.