来自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的)
linux安装OpenCV以及windows安装numpycv2等python2.7模块