使用ffmpeg更新视频上的PNG叠加层

6
我正在尝试制作一个带有图形数据的RTMP视频流。我已经有一个命令可以创建所需的输出。但唯一的问题是,尽管PNG图像在渲染过程中被更新到磁盘上,但叠加层始终保持不变。我希望FFmpeg每次检测到PNG图像被更改(或每分钟一次),就从磁盘中获取它并将其用作叠加层,这种情况是否可能?
以下是我用于渲染输出的命令:
ffmpeg \
-re -y \
-f lavfi \
-i "movie=filename=video/videobg.mp4:loop=0, setpts=N/(FRAME_RATE*TB)" \
-loop 1 \
-i images/forecast.png \
-filter_complex "[1:v]format=argb,geq=r='r(X,Y)':a='0.9*alpha(X,Y)'[overlay]; [0:v][overlay]overlay" \
-i data/musicbg.mp3 \
-ac 1 \
-ar 44100 \
-b:a 128k \
-vcodec libx264 \
-pix_fmt yuv420p \
-r 30 \
-g 60 \
output.mp4

不直接可能。您可以尝试通过管道输入图像,即“-f image2pipe-framerate 1/60 -i pipe:.png”。 - Gyan
我不明白如何正确使用这个选项。你能提供一些例子吗? - Rodion Baskakov
1个回答

7

好的,我终于找到了制作我想要的内容的方法。希望这对其他人有用。

我所做的唯一一件事就是为图像输入添加了一个-f image2选项。命令与我上面发布的命令略有不同,因为我改变了输入源的顺序,但实际上它是相同的。 以下是解决方案:

ffmpeg \
-re -y \
-loop 1 \
-f image2 \
-i images/forecast.png \
-f lavfi \
-i "movie=filename=video/videobg.mp4:loop=0, setpts=N/(FRAME_RATE*TB)" \
-filter_complex "[0:v]format=argb,geq=r='r(X,Y)':a='0.9*alpha(X,Y)'[overlay]; [1:v][overlay]overlay" \
-i data/musicbg.mp3 \
-ac 1 \
-ar 44100 \
-b:a 128k \
-vcodec libx264 \
-pix_fmt yuv420p \
-r 30 \
-g 60 \
output.mp4

奇怪。我本以为单个图像的默认复用器也是image2。结果发现它是imageauto解复用器,对于PNG文件显示为png_pipe,但对于单个JPG文件则不是。知道这点很好。谢谢。 - Gyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接