我正在使用以下代码来获取多个不同持续时间的 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 像素左右的条。如果该条是深灰色,则一切正常。
如果该条是红色的,则许多图像会被丢失,或者可能丢失帧。
另外,我注意到脚本的运行方式会根据条形图是红色还是深灰色而有所不同。如果条形图是红色,则需要逐行处理;如果条形图是深灰色,则似乎在一行处理中发生了相同的编码。
答案1
并非所有 PNG 都具有相同的像素格式。我看到它在 rgba 和 pal8(8 位调色板)之间交替。当输入中途更改其属性时,ffmpeg 会重新初始化过滤器。发生这种情况时,所有缓冲帧都会被丢弃。
从 ffmpeg 4.2 开始,有一个选项可以防止重新初始化。在这种情况下,必须手动协调像素格式。对于较旧的版本,可以使用相同的像素格式创建中间版本。
从 ffmpeg 4.2 开始,你可以运行
ffmpeg -safe 0 -f concat -reinit_filter 0 -i overlap-png.txt
-i mainvideo.MOV -filter_complex "[1]scale=1920:-1[1v];[0:v]null,format=rgba[0v];[1v][0v]overlay=0:0"
-c:v libx264 -profile:v baseline -pix_fmt yuv420p
-level 3.1 -y finishedvideo.mp4
对于旧版本,首先创建一个中间文件,
ffmpeg -safe 0 -f concat -i overlap-png.txt -copyts -c:v png -pix_fmt rgba -vsync 0 overlap.mov
然后运行原始命令。