【问题标题】:How to minimize the delay in a live streaming with ffmpeg如何使用 ffmpeg 最小化实时流媒体的延迟
【发布时间】:2013-05-15 13:31:00
【问题描述】:

我有问题。 我会从我的网络摄像头使用 ffmpeg 进行直播。

  1. 我启动了 ffserver,它可以工作了。
  2. 我从另一个终端启动 ffmpeg 以使用此命令进行流式传输 它有效:

    sudo ffmpeg -re -f video4linux2 -i /dev/video0 -fflags nobuffer -an http://localhost:8090/feed1.ffm
    
  3. 在我的配置文件中,我有这个流:

    <Stream test.webm>
    Feed feed1.ffm
    Format webm
     NoAudio
     VideoCodec libvpx
     VideoSize 720x576
     VideoFrameRate 25
     # Video settings
        VideoCodec libvpx
        VideoSize 720x576           # Video resolution
        VideoFrameRate 25           # Video FPS
        AVOptionVideo flags +global_header  # Parameters passed to encoder 
                                        # (same as ffmpeg command-line parameters)
        AVOptionVideo cpu-used 0
        AVOptionVideo qmin 10
        AVOptionVideo qmax 42
        #AVOptionVideo quality good
        PreRoll 5
         StartSendOnKey
        VideoBitRate 400            # Video bitrate
     </Stream>
    
  4. 我启动流

    ffplay http://192.168.1.2:8090/test.webm 它有效,但我有 4 秒的延迟,我会尽量减少这种延迟,因为这对我的应用程序至关重要。 谢谢

【问题讨论】:

  • 你可以尝试减小probesize的值:ffplay -probesize 500000 http://192.168.1.2:8090/test.webm(到500 Kb,试试这个值,如果我没记错的话,默认值是5Mb。)
  • 好的,谢谢。现在我必须在移动浏览器中观看流,所以我不能使用 ffplay。我需要一些建议来优化配置文件。
  • 阅读ffmpeg.org/sample.html 我可以想象您可以尝试使用 VideoBufferSize 或降低 GOP(它会增加带宽使用)。
  • 您找到解决方案了吗?

标签: ffmpeg streaming delay http-live-streaming webm


【解决方案1】:

我找到了三个帮助我减少直播延迟的命令。第一个命令非常基本且直接,第二个命令与其他选项结合在一起,这些选项可能在每个环境中的工作方式不同,最后一个命令是我在文档中找到的 hacky 版本它在开始时很有用,但现在第一个选项更稳定。

1。基本使用-fflags nobuffer

此格式标志可减少初始输入流分析期间缓冲引入的延迟。此命令将显着减少延迟,并且不会引入音频故障。

ffplay -fflags nobuffer -rtsp_transport tcp rtsp://<host>:<port>

2。高级-flags low_delay 和其他选项。

我们可以将之前的 -fflags nobuffer 格式标志与其他通用选项和高级选项结合起来,以获得更详细的命令:

  • -flags low_delay 这个编解码器通用标志将强制低延迟。
  • -framedrop:如果视频不同步,则丢弃视频帧。如果主时钟未设置为视频,则默认启用。使用此选项可为所有主时钟源启用丢帧
  • -strict experimental,最后是 -strict 指定如何严格遵循标准,experimental 选项允许非标准化的实验性事物、实验性(未完成/正在进行中/未经过良好测试)解码器和编码器。此选项是可选,请记住实验性解码器可能会带来安全风险,请勿将其用于解码不受信任的输入。
ffplay -fflags nobuffer -flags low_delay -framedrop \
-strict experimental -rtsp_transport tcp rtsp://<host>:<port>

此命令可能会引入一些音频故障,但很少见。

您也可以尝试添加: * -avioflags direct 减少缓冲,和 * -fflags discardcorrupt 丢弃损坏的数据包,但我认为这是非常激进的方法。 这可能会破坏音视频同步

ffplay -fflags nobuffer -fflags discardcorrupt -flags low_delay \ 
-framedrop -avioflags direct -rtsp_transport tcp rtsp://<host>:<port>

3。一个 hacky 选项(在旧文档中找到)

这是一个调试解决方案,它基于将 -probesize-analyzeduration 设置为较低的值来帮助您的流更快地启动。

  • -probesize 32 以字节为单位设置探测大小(即要分析以获取流信息的数据大小)。如果信息分散到流中,较高的值将能够检测到更多信息,但会增加延迟。必须是不小于 32 的整数。默认为 5000000。
  • analyzeduration 0 指定分析多少微秒来探测输入。较高的值将能够检测到更准确的信息,但会增加延迟。默认为 5000000 微秒(5 秒)。
  • -sync ext 将主时钟设置为外部源以尝试保持实时。默认为音频。主时钟用于控制音视频同步。这意味着此选项将音频-视频同步设置为一种类型(即 type=audio/video/ext)。
ffplay -probesize 32 -analyzeduration 0 -sync ext -rtsp_transport tcp rtsp://<host>:<port>

此命令有时可能会引入一些音频故障。

-rtsp_transport 可以根据您的流媒体设置为udptcp。对于这个例子,我使用tcp

【讨论】:

  • 这些对我的测试都没有任何影响。将 SDL 预览与 ffmpeg(不是 ffplay)一起使用是减少延迟的唯一选择(但没有声音是一个明显的缺点)。
  • 从其默认值中减少分析持续时间和探针大小对我来说是诀窍。可以从流开始时间减少 2-3 秒。
  • 我不建议为直播附加 nobuffer 标志。实际上,它似乎确实会在丢帧期间引起故障。导致视频停顿几秒钟,或重复某些片段 - 可以使用 -vsync 选项控制此行为。此外,这种直播流的 VOD 充满了损坏的帧,并且必须重新编码。删除 nobuffer 标志解决了我的问题。
  • @PatrykCieszkowski 请记住,这是针对ffplay 而不是ffmpeg 的解决方案。主要思想是减少播放流时的延迟。如果您想以低延迟对其进行存储或转码,ffmpeg -re 可能会有所帮助,但每种解决方案都有其自身的优缺点。
【解决方案2】:

FFMpeg 的流媒体指南有一个关于如何减少延迟的特定部分。我还没有尝试过他们所有的建议。 http://ffmpeg.org/trac/ffmpeg/wiki/StreamingGuide#Latency

他们特别说明了 ffplay 引入的延迟:

默认情况下,ffplay 引入了自己的小延迟,mplayer 及其-nocache 用于测试延迟(或-benchmark)也很有用。 据说使用 SDL 输出可以以最小的延迟查看帧:ffmpeg ... -f sdl -

【讨论】:

  • 谢谢,链接中的ffplay -probesize 32 -sync ext INPUT 对我有用!
  • 你实现了多少延迟?我需要超过 100 毫秒的流媒体延迟。有可能吗?
  • 我没有测量最后的延迟,但它看起来很接近亲自在监视器上直播的声音,声音是通过音响室的,所以对我来说已经足够了。
【解决方案3】:

尝试将flagsAVFormatContext 设置为AVFMT_FLAG_NOBUFFER | AVFMT_FLAG_FLUSH_PACKETS

AVFormatContext *ctx;
...
ctx->flags = AVFMT_FLAG_NOBUFFER | AVFMT_FLAG_FLUSH_PACKETS;

然后尝试将解码器线程设置为1。似乎更多的线程会导致更多的延迟。

AVCodecContext *ctx;
...
ctx->thread_count = 1;

【讨论】:

    猜你喜欢
    • 2020-05-02
    • 2015-09-03
    • 2018-10-11
    • 2023-03-09
    • 2019-01-04
    • 2020-10-01
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多