关于这个主题有很多问题,但大多数都涉及使用不受欢迎的协议 - 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秒的延迟。
答案 0 :(得分:1)
首先,你必须找出延迟来自哪里。
有四种潜在的基本来源:
由于您是从localhost测量的,我们可以将传输视为0秒。如果您的视频分辨率和帧速率不是很大,那么解码时间也将接近于零。
我们现在应该专注于前2个itens:捕获和编码。
"问题"这是libx264是一个软件编码器。因此,它使用CPU功率并且需要主存储器中的数据,而不是首先创建图像的GPU存储器。
因此,当FFMPEG捕获帧时,它必须将操作系统的各层从视频内存传递到主存储器。
不幸的是,如果您使用libx264,则不会获得比3或2秒更好的结果。
我建议你看看Nvidia Capture解决方案。 https://developer.nvidia.com/capture-sdk
如果您正在使用功能强大的GPU,则可以直接在GPU中从后备缓冲区或帧内缓冲区捕获和编码每个帧。您可以使用ffmpeg随意发送它。