我正在使用以下代码获取许多不同持续时间的 PNG,并将它们覆盖在另一个视频上。
ffmpeg -safe -0 -f concat -i overlap-png.txt
-i mainvideo.MOV -filter_complex "[1]scale=1920:-1[1v];[0:v]fps=30[0v];[1v][0v]overlay=0:0"
-c:v libx264 -profile:v baseline -pix_fmt yuv420p
-level 3.1 -y finishedvideo.mp4
然而,我发现了一件非常奇怪的事情。.txt 文件中提到的 PNG 文件基本上都是透明的,除了底部的一个大约 300 像素左右的条。如果该条为深灰色,则一切正常。
如果该条为红色,则许多图像被丢弃或帧可能被丢弃。
此外,我注意到脚本的运行方式不同,具体取决于条形是红色还是深灰色。如果它是红色的,则有更多的逐行处理,如果它是深灰色,则似乎在一行处理中发生了相同的编码。
并非所有 PNG 都具有相同的像素格式。我看到它在 rgba 和 pal8(8 位调色板)之间交替。当输入中途更改其属性时,ffmpeg 会重新初始化过滤器。发生这种情况时,任何缓冲的帧都会被丢弃。
从 ffmpeg 4.2 开始,有一个选项可以防止重新初始化。在这种情况下,必须手动协调像素格式。对于旧版本,可以使用相同的像素格式创建中间版本。
从 ffmpeg 4.2 开始,您可以运行
对于旧版本,首先创建一个中间文件,
然后运行您的原始命令。