来自WINDOWS中的c ++ opencv应用程序的低延迟视频流

时间:2017-11-14 08:48:55

标签: c++ windows opencv rtsp mjpeg

关于这个主题有很多问题,但大多数都涉及使用不受欢迎的协议 - HTML5,WebRTC等。

基本上,问题可以表达如下:如何在 Windows 中通过RTSP或MJPEG [AFAIK,它更适合实时流式传输]流传输我自己的cv :: Mat图像?我能找到的几乎所有东西都依赖于操作系统是Linux,并且不适用于该项目。

FFMPEG的流水线工作,但延迟大约10秒。使用-incomprehensibly-long-parameter-list-that-ffmpeg-team-loves-so-much可以把它缩短到3-4秒,但这还不够,因为正在考虑的项目是一个活跃用户的监控应用程序控制相机,所以我需要尽可能接近实时。

另一个问题是解决方案不应该占用全部内核,因为它们已经超载了对象跟踪算法。

提前感谢您的帮助!

修改ffmpeg -re -an -f mjpeg -i http://..addr.../video.mjpg -vcodec libx264 -tune zerolatency -f rtp rtp://127.0.0.1:1234 -sdp_file stream.sdp - 用于直接重新传输流而不进行任何预处理的命令,它在本地主机上产生了大约4秒的延迟

1 个答案:

答案 0 :(得分:1)

首先,你必须找出延迟来自哪里。

有四种潜在的基本来源:

  1. 视频捕获
  2. 编码
  3. 传送
  4. 解码(玩家)
  5. 由于您是从localhost测量的,我们可以将传输视为0秒。如果您的视频分辨率和帧速率不是很大,那么解码时间也将接近于零。

    我们现在应该专注于前2个itens:捕获和编码。

    "问题"这是libx264是一个软件编码器。因此,它使用CPU功率并且需要主存储器中的数据,而不是首先创建图像的GPU存储器。

    因此,当FFMPEG捕获帧时,它必须将操作系统的各层从视频内存传递到主存储器。

    不幸的是,如果您使用libx264,则不会获得比3或2秒更好的结果。

    我建议你看看Nvidia Capture解决方案。 https://developer.nvidia.com/capture-sdk

    如果您正在使用功能强大的GPU,则可以直接在GPU中从后备缓冲区或帧内缓冲区捕获和编码每个帧。您可以使用ffmpeg随意发送它。