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

Posted

技术标签:

【中文标题】来自WINDOWS中c ++ opencv应用程序的低延迟视频流[关闭]【英文标题】:Low-latency video streaming from c++ opencv application in WINDOWS [closed] 【发布时间】:2017-11-14 08:48:54 【问题描述】:

关于这个话题有很多问题,但大多数都涉及到使用不受欢迎的协议——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】:

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

有四种基本的延迟来源:

    视频捕捉 编码 传输 解码(播放器)

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

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

这里的“问题”是 libx264 是一个软件编码器。因此,它使用 CPU 能力并且需要主内存中的数据,而不是首先创建图像的 GPU 内存中的数据。

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

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

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

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

【讨论】:

不幸的是,我正在使用的那台单板 PC 上没有独立的 GPU 显卡:(

以上是关于来自WINDOWS中c ++ opencv应用程序的低延迟视频流[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

来自带有 Opencv C 程序的网络摄像头的灰色图像,但 C++ 程序完美运行

如何使用OpenCV(C ++代码)访问IP摄像机?有没有办法访问OpenCv + vlc? (Windows 7的)

OpenCV 中的轮廓比较(从 C 到 C++ 的转换)

linux安装OpenCV以及windows安装numpycv2等python2.7模块

在 Windows7 中运行 conda install -c menpo opencv3=3.2.0 失败

windows命令行打开opencv的exe不行