【问题标题】:How to force ffmpeg to refresh overlay image more often?如何强制 ffmpeg 更频繁地刷新覆盖图像?
【发布时间】:2019-04-26 23:34:08
【问题描述】:

我正在尝试使用 ffmpeg 进行体育直播。正在从服务器获取流式匹配的分数并转换为 png。此 png 必须出现在视频顶部。

ffmpeg 允许使用 image2 解复用器在视频流上放置叠加层。如果我使用 -loop1,此覆盖图大约每 5 秒更新一次。如何强制 ffmpeg 更频繁地从磁盘读取它?

我当前尝试每 5 秒更新一次叠加层(用于测试目的的 mp4 视频):

nice -n -19 ffmpeg \
        -re -y \
        -i s.mp4 \
        -f image2 -loop 1 -i http://127.0.0.1:3000/img \
        -filter_complex "[0:v][1:v]overlay" \
        -threads 4 \
        -v 0 -f mpegts -preset ultrafast udp://127.0.0.1:23000 \
        &

附言 我知道,我可以在网站上制作 youtube 流媒体小部件,并仅使用 html/css/js 将分数放在上面。但遗憾的是必须直接在视频流中完成。

P.P.S 我知道,我可以使用 ffmpeg drawtext。但这不是我想要的。我有专门设计的 png,它必须尽可能频繁地更新(1-2 秒一次就好了)

【问题讨论】:

    标签: ffmpeg video-streaming png overlay


    【解决方案1】:

    三件事:

    1) -re 应用于每个输入,因此 ffmpeg 当前正在以与视频异步的速率读取您的图像。由于视频是实时读取的,图像阅读器将循环图像的数据包排队,直到过滤器图可以使用它们。因此,更新后的图像将被消耗得更晚,并且分配的时间戳比实际更新时更大。在图像-i 之前添加-re 以更正此问题。

    2) 跳过-loop 1 并使用-stream_loop -1,因为如果在尝试读取输入时输入被阻塞或为空(由于更新),image2 解复用器可能会中止。虽然,由于输入是通过网络协议读取的,这对您来说可能不是问题。

    3) 您没有在输出选项中指定编码器。由于格式为 MPEG-TS,ffmpeg 将选择mpeg2video,默认比特率为 200 kbps。 ultrafast 预设不适用于此编码器。您可能想添加-c:v libx264

    【讨论】:

    • 谢谢@gyan!新版本从文件系统获取图像,所以 stream_loop 工作得很好。但不幸的是,整体速度保持不变(每 5 秒更新一次)。代码:nice -n -19 ffmpeg \ -re -y \ -i s.mp4 \ -f image2 -stream_loop -1 -re -i sets.png \ -filter_complex "[0:v][1:v]overlay" \ -threads 4 \ -v 0 -f mpegts -c:v libx264 -preset superfast udp://127.0.0.1:23000 \ &
    • sets.png 多久更改一次?
    • 每秒都在变化
    • stat -c确认?
    • 没看 statc,但是我的脚本在 fwrite 之后记录了时间
    【解决方案2】:

    我发现,将 image2 的帧率值增加到 90-100 会使文件读取过程更快,但音频会受到限制

    【讨论】:

      猜你喜欢
      • 2012-05-09
      • 2017-12-28
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      相关资源
      最近更新 更多