【问题标题】:Low-latency video streaming from c++ opencv application in WINDOWS [closed]来自WINDOWS中c ++ opencv应用程序的低延迟视频流[关闭]
【发布时间】: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 秒的延迟在本地主机上。

【问题讨论】:

    标签: c++ windows opencv rtsp mjpeg


    【解决方案1】:

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

    有四种基本的延迟来源:

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

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

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

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

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

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

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

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

    【讨论】:

    • 不幸的是,我正在使用的那台单板 PC 上没有独立的 GPU 显卡:(
    猜你喜欢
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 2012-01-25
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多