我正在尝试使用 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 秒一次就好了)
最佳答案
三件事:
1) -re
每个输入都应用,因此 ffmpeg 当前正在以相对于视频异步的速率读取您的图像。由于视频是实时读取的,图像阅读器将循环图像的数据包排队,直到过滤器图可以使用它们。因此,更新后的图像将被消耗得更晚,并且分配的时间戳比实际更新时更大。添加 -re
图片前-i
纠正这一点。
2) 跳过-loop 1
并使用 -stream_loop -1
因为如果在尝试读取输入时输入被阻塞或为空(由于更新),image2 解复用器可能会中止。虽然,由于输入是通过网络协议(protocol)读取的,这对您来说可能不是问题。
3) 您在输出选项中没有指定编码器。由于格式是MPEG-TS,ffmpeg会选择mpeg2video
默认比特率为 200 kbps。 ultrafast
预设不适用于此编码器。您可能想添加 -c:v libx264
.
关于ffmpeg - 如何强制 ffmpeg 更频繁地刷新覆盖图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55876001/