评估链式过滤器时忽略过滤器分号的 FFmpeg 结尾

Posted

技术标签:

【中文标题】评估链式过滤器时忽略过滤器分号的 FFmpeg 结尾【英文标题】:FFmpeg end of filter semicolon being ignored when evaluating chained filters 【发布时间】:2020-01-20 17:54:53 【问题描述】:

我是 FFmepg 的新手,所以如果术语有误,请原谅我。

我想将文本和音频添加到现有视频文件中。我将 2 个drawTexts 链接在一起,然后在不同的过滤器中,我想合并原始源视频的音轨和一些背景音乐。

ffmpeg -i sourceNoText.mp4 -i backgroundMusic.mp3 -filter_complex "drawtext=enable='between(t,0,3.5)':fontfile=burbank.ttf:text='Your name - PETER':fontsize=90:x=(w-text_w)/2:y=(h-th-(h/10)-20):fontcolor='White', drawtext=enable='between(t,11.5,14.75)':fontfile=burbank.ttf:text='You couldn't have done it without Peter':fontcolor='White':fontsize=90:x=(w-text_w)/2:y=(h-th-(h/10)-20);[0:a][1:a]amerge,pan=stero:c0<c0+c2:c1<c1+c3[outMergedAudio]" -map 0:v -map "[outMergedAudio]" -c:a aac edited.mp4

我的理解是过滤器用分号分隔,但是当我尝试进行音频合并时,该部分命令正在drawtext 过滤器中进行解释。

[drawtext @ 0000020fe395bec0] Cannot find color 'c0<c0+c2'
[drawtext @ 0000020fe395bec0] Unable to parse option value "c0<c0+c2" as color
[drawtext @ 0000020fe395bec0] Cannot find color 'c0<c0+c2'
[drawtext @ 0000020fe395bec0] Unable to parse option value "c0<c0+c2" as color
[drawtext @ 0000020fe395bec0] Error setting option fontcolor to value c0<c0+c2.
[Parsed_drawtext_1 @ 0000020fe395ad00] Error applying options to the filter.
[AVFilterGraph @ 0000020fe3892e00] Error initializing filter 'drawtext' with args 'enable=between(t,11.5,14.75):fontfile=burbank.ttf:text=You couldnt have done it without Peter:fontcolor=White:fontsize=90:x=(w-text_w)/2:y=(h-th-(h/10)-20);[0:a][1:a]amerge,pan=stero:c0<c0+c2:c1<c1+c3[outMergedAudio]'
Error initializing complex filters.

在没有音频过滤器的情况下运行效果很好,所以我认为不会出现语法错误。我错过了什么?为 drawText 链指定输入和输出流仍然会产生同样的问题。

我使用的是 ffmpeg 版本 4.2.1。

提前致谢。

【问题讨论】:

一目了然无法发现任何错误。将音频过滤器移到前面并尝试。 【参考方案1】:

因为你的第二个drawtext的文本字符串中有一个单引号,用单引号括起来,这会抛出一些解析器状态。用转义的双引号将文本括起来,并在其中转义单引号。

此外,不推荐使用 pan 语法。

ffmpeg -i sourceNoText.mp4 -i backgroundMusic.mp3 -filter_complex "drawtext=enable='between(t,0,3.5)':fontfile=burbank.ttf:text='Your name - PETER':fontsize=90:x=(w-text_w)/2:y=(h-th-(h/10)-20):fontcolor='White', drawtext=enable='between(t,11.5,14.75)':fontfile=burbank.ttf:text=\"You couldn\'t have done it without Peter\":fontcolor='White':fontsize=90:x=(w-text_w)/2:y=(h-th-(h/10)-20);[0:a][1:a]amerge,pan=stereo|c0&lt;c0+c2|c1&lt;c1+c3[outMergedAudio]" -map 0:v -map "[outMergedAudio]" -c:a aac edited.mp4

【讨论】:

这很有意义 - 非常感谢。我觉得有点傻。 当我使用它时,命令的其余部分被评估为文本。将字符串更改为单引号会导致它不知道“couldn\'t”是什么。简单的解决方案是将我的文本选项移动到语句的末尾并替换为\\\'。再次感谢:)

以上是关于评估链式过滤器时忽略过滤器分号的 FFmpeg 结尾的主要内容,如果未能解决你的问题,请参考以下文章

MySQL检索和过滤数据

FFmpeg amix + 音量过滤器创建饱和输出?

ffmpeg过滤器系列:序章,什么是ffmpeg过滤器?ffmpeg过滤器可以用来做什么

ffmpeg过滤器系列:序章,什么是ffmpeg过滤器?ffmpeg过滤器可以用来做什么

django中具有多个参数的过滤器和链式过滤器之间的区别

设计模式之使用Java 流式过滤实现过滤器模式链式过滤