如何避免在 FFMPEG 3.3.5 错误和所需功能之间陷入僵局?

如何避免在 FFMPEG 3.3.5 错误和所需功能之间陷入僵局?

项目需要 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_ac‌​tion=endall, \
          format=y‌​uv420p[vid], \
     [vid]dra‌​wtext=fix_bounds=tru‌​e:text='This is a comment':font=bold:x=(w-text_w)/2:y=h-(text_h*1)-40:borderco‌​[email protected]:borde‌​rw=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_ac‌​tion=endall, \
          format=y‌​uv420p, \
          dra‌​wtext=fix_bounds=tru‌​e:text='This is a comment':font=bold:x=(w-text_w)/2:y=h-(text_h*1)-40:borderco‌​[email protected]:borde‌​rw=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,
          dra‌​wtext=fix_bounds=tru‌​e:text='This is a comment':font=bold:x=(w-text_w)/2:y=h-(text_h*1)-40:borderco‌​[email protected]:borde‌​rw=7"
 test.mp4

笔记:

1) 不同的过滤器链应该用分号而不是逗号分隔。当过滤器链的输入集与前一个过滤器的输出集不相同时,该过滤器链就是不同的,例如 scale 接受一个输入并发出一个输出。overlay 接受两个输入,因此会形成一个新的过滤器链。同样,drawtext 单个输出不会传递到 anull,因此这是一个不同的过滤器链。相反,如果一个过滤器的输出与另一个过滤器的输入相同,则可以用逗号分隔它们,并且在该连接处不需要标签。

2)我在修改后的命令中保留了音频过滤器的无效功能,但它没有任何作用。它供开发人员测试使用。

3)覆盖默认为yuv420p输出,因此不需要格式。

4) 替代方法是更可取的,因为覆盖层会与基本输入同步,如果覆盖层的帧速率较高,则会从覆盖层中丢弃帧。不过,在大多数情况下可能并不明显。

相关内容