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

Low-latency video streaming from c++ opencv application in WINDOWS

关于该主题的问题很多,但大多数涉及使用不需要的协议 - HTML5、WebRTC 等

基本上,问题可以表述如下:如何通过 RTSP 或 MJPEG [AFAIK 实时流式传输更好] 我自己的 cv::Mat 图像 Windows?我能找到的几乎所有内容都依赖于 OS 是 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 秒的延迟

首先你必须找出延迟的来源。

有 4 种基本的延迟来源:

  1. 视频捕捉
  2. 编码
  3. 传输
  4. 解码(播放器)

由于您是从本地主机测量的,我们可以将传输视为 0 秒。如果您的视频分辨率和帧率不是很大,解码时间也将接近于零。

我们现在应该关注前两个项目:捕获和编码。

这里的"problem"是libx264是软件编码器。因此,它使用 CPU 功率并且需要主内存中的数据,而不是首次创建图像的 GPU 内存中的数据。

因此,当 FFMPEG 捕获帧时,它必须将 OS 的层从视频内存传递到主内存。

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

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

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