项目需要 v3.3.5 中提供的可选 FFMPEG 功能。命令示例如下:
ffmpeg -y -i original.mp4 -f lavfi -i color=c=black:s=960x540 \
-filter_complex "[0:v]scale=-1:540[scaled], \
[1:v][scaled]overlay=shortest=1:x=(main_w-w)/2:eof_action=endall, \
format=yuv420p[vid], \
[vid]drawtext=fix_bounds=true:text='This is a comment':font=bold:x=(w-text_w)/2:y=h-(text_h*1)-40:borderco[email protected]:borderw=7[out], \
[0:a]anull[audio]" \
-map "[out]" -map "[audio]" test.mp4
然而,这个版本因 v3.3.3 中引入的一个错误而失败。一些相关的问题通过回滚到 FFMPEG v3.2.x 来“解决”该问题,但我的项目无法使用 v3.3。
早期反馈穆尔维亚建议使用此命令解决一些问题。对于这种看似僵局的情况,有什么解决办法吗?
答案1
您的原始命令可以修改为
ffmpeg -y -i original.mp4 -f lavfi -i color=c=black:s=960x540=d=1 \
-filter_complex "[0:v]scale=-1:540[scaled]; \
[1:v][scaled]overlay=x=(main_w-w)/2:eof_action=endall, \
format=yuv420p, \
drawtext=fix_bounds=true:text='This is a comment':font=bold:x=(w-text_w)/2:y=h-(text_h*1)-40:borderco[email protected]:borderw=7[out]; \
[0:a]anull[audio]" \
-map "[out]" -map "[audio]" test.mp4
或者,这会产生相同的结果,
ffmpeg -y -i original.mp4 \
-vf "scale=-1:540,pad=960:540:(ow-iw)/2,
drawtext=fix_bounds=true:text='This is a comment':font=bold:x=(w-text_w)/2:y=h-(text_h*1)-40:borderco[email protected]:borderw=7"
test.mp4
笔记:
1) 不同的过滤器链应该用分号而不是逗号分隔。当过滤器链的输入集与前一个过滤器的输出集不相同时,该过滤器链就是不同的,例如 scale 接受一个输入并发出一个输出。overlay 接受两个输入,因此会形成一个新的过滤器链。同样,drawtext 单个输出不会传递到 anull,因此这是一个不同的过滤器链。相反,如果一个过滤器的输出与另一个过滤器的输入相同,则可以用逗号分隔它们,并且在该连接处不需要标签。
2)我在修改后的命令中保留了音频过滤器的无效功能,但它没有任何作用。它供开发人员测试使用。
3)覆盖默认为yuv420p输出,因此不需要格式。
4) 替代方法是更可取的,因为覆盖层会与基本输入同步,如果覆盖层的帧速率较高,则会从覆盖层中丢弃帧。不过,在大多数情况下可能并不明显。