我正在使用以下代码来获取多个持续时间不同的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开始,您可以运行
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
然后运行您的原始命令。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句