如何使用 FFmpeg 滤镜美化您的音频和视频文件





5.00/5 (2投票s)
使用 FFmpeg 滤镜进行裁剪、复制、转换、混合、旋转、翻转、调整大小、裁剪、合并、合成、模糊、锐化、平滑、左右分屏、画中画、淡入/淡出
引言
您可能以前遇到过 FFmpeg 这个工具。它是一个开源的命令行工具,可以执行简单的多媒体格式转换,例如:
ffmpeg -i video.avi video.mp4
ffmpeg -i audio.wav audio.mp3
FFmpeg 足够智能,可以预判您的意图。例如,如果您想从视频文件中提取音频,您无需纠结于编解码器等细节。FFmpeg 会自动选择最佳设置。
ffmpeg -i video.mp4 audio.mp3
FFmpeg 的更多功能以滤镜的形式提供。FFmpeg 滤镜的语法晦涩难懂,文档也有些晦涩。因此,大多数人都会避开它们。但现在不一样了,“我来教你”。
背景
多年来,我一直没有 botherFFmpeg 滤镜。我唯一使用的滤镜是 volume 滤镜,我(盲目地)用它来放大音量低的音频文件。我甚至在一本杂志上写了一篇关于 FFmpeg 技巧的文章,却不知道任何更好的方法。去年,在封锁期间,我决定为那篇文章写一篇后续——算是一种“更多 FFmpeg 技巧”。当我深入研究 FFmpeg 时,我决定写一本书。现在,这是一本 152 页的全彩平装书,在亚马逊上有售——FFMPEG Quick Hacks。本着开源的精神,我将其电子书版本免费提供。这本书有一个完整的教程,而不仅仅是技巧的集合。事实上,教程构成了这本书的大部分内容。技巧部分只是一个大章节。直到为时已晚,我才意识到我的错误。
对于这本书和本文,我使用的是 Linux。如果您使用的是 Windows,您需要小心地用插入符号 (^) 替换多行命令中的反斜杠 (\)。
FFmpeg 滤镜语法
FFmpeg 有很多滤镜——比您想象的还要多。它们在此链接 处 列出并详细描述。这些滤镜中的每一个都代表一个处理阶段,可以单独使用,也可以与其他滤镜串联使用。一个或多个多媒体流(音频、视频、字幕)可以作为滤镜的输入。根据滤镜执行的处理类型,它可能有一个或多个输出多媒体流。一个滤镜的输出可以用作后续滤镜的输入。
这是一个简单的滤镜示例。它将音频流的音量增加了三分之一。
ffmpeg -i low.mp3 -af "volume=1.33" high.mp3
当我想要稍微旋转视频时,我用了这个。
ffmpeg -y -i barbara.mp4 \
-vf rotate=angle=-20*PI/180:fillcolor=brown \
barb20.mp4
上面命令中粗体部分是滤镜定义。许多生产中的滤镜定义可能看起来难以理解和令人困惑,但它并非高深莫测。FFmpeg 滤镜使用标准语法。
[input label1][input label2]...[input_labelN]filter=key=value pair1:key=value
pair2...key=value pairN[output label1][output label2]...[output labelN]
在定义滤镜之前,请使用 `-filter_complex` 命令开关。它处理所有类型的滤镜,并消除令人困惑的错误。
多个滤镜需要用分号 (;) 分隔。但是,在滤镜字符串的末尾不应该有分号。一个滤镜可以有一个或多个输入和/或输出。(有些特殊滤镜则没有。)输入可以是输入文件中的流,也可以是您在前面的滤镜中指定的任何临时输出标签。输出标签可以用作后续滤镜的输入,或用于滤镜定义外部的映射赋值。如果滤镜的输入与紧邻其前面的滤镜的输出相同,则可以使用逗号代替分号。我将通过一个例子解释其中的大部分内容。
ffmpeg -i Tasmania-Nobrainia.mp4 \
-filter_complex \
"[0:a:0]atrim=start=60:end=120[trimmed];
[trimmed]volume=volume=1.6[amped]" \
-map '[amped]' \
second-mminute-audio-amped.mp3
在这个命令中,使用了两个滤镜——`atrim` 和 `volume`。第一个滤镜用于从其输入音频流中提取特定部分。第二个滤镜用于更改其输入音频流的音量级别。在 `atrim` 之前,输入音频流被指定为 `[0:a:0]`。这指的是第一个输入文件中的第一个音频流。`start` 和 `end` 键值对指定了提取必须发生的时间戳——即第二分钟。提取的音频然后被打包为标记为 `[trimmed]` 的输出流。此标签被指定为下一个 `volume` 滤镜的输入。`volume` 滤镜具有一个键值对,也命名为 `volume`。此滤镜使输入音频流(标记为 `[trimmed]`)的音量增加三分之二。滤镜的输出被标记为 `[amped]`。之后,滤镜定义结束。[注意:滤镜定义末尾没有分号。]
重要的是,滤镜只能引用现有的输入文件流或先前创建的输出标签。否则,FFmpeg 将开始猜测。如果它不成功,就会出错。在上面的命令中,指定的输入音频流 `[0:a:0]` 实际上不是必需的。FFmpeg 会自动选择它。考虑到输出格式是音频文件,最后一个滤镜不必为其输出标记 `-map` 开关。FFmpeg 会自动从最后一个滤镜的输出中选择它。[注意:请勿让任何输出未使用。最后一个输出应匹配输出文件容器(格式)所需的流。]
ffmpeg -i Tasmania-Nobrainia.mp4 \
-filter_complex \
"atrim=start=60:end=120[trimmed];
[trimmed]volume=volume=1.6" \
second-mminute-audio-amped.mp3
更进一步,如果值按 滤镜文档 中指定的顺序排列,则键也并非必需。
ffmpeg -i Tasmania-Nobrainia.mp4 \
-filter_complex \
"atrim=60:120[trimmed];
[trimmed]volume=1.6" \
second-mminute-audio-amped.mp3
大多数在线 FFmpeg 滤镜示例都是这样的。如果没有滤镜文档,滤镜定义可能会显得晦涩难懂。
更多 FFmpeg 滤镜示例
在吉姆·凯瑞的一些电影中,他会在播放时倒放一个场景。倒放的镜头听起来清楚吗?让我们使用 FFmpeg 滤镜来试试。
ffmpeg -y -i ace-ventura-reverse.mp4 \
-filter_complex \
"[0:v:0]reverse[v]; [0:a:0]areverse[a]" \
-map '[v]' -map '[a]' \
ace-ventura-reverse-reversed.mp4
#Place them side-by-side
ffmpeg -y -i ace-ventura-reverse.mp4 -i ace-ventura-reverse-reversed.mp4 \
-filter_complex \
"[0:v:0]pad=1280:360:0:0[frame];
[frame][1:v:0]overlay=640:0[fullvideo];
[fullvideo]drawtext=x=30:y=60:fontcolor=yellow:text=
'Original audio on left speaker':fontsize=30:fontfile=Florentia.ttf[lefttext];
[lefttext]drawtext=x=670:y=60:fontcolor=yellow:text=
'Reversed audio on right speaker':fontsize=30:fontfile=Florentia.ttf[v];
[0:a:0]channelsplit=channel_layout=mono[leftaudio];
[1:a:0]channelsplit=channel_layout=mono[rightaudio];
[leftaudio][rightaudio]join=inputs=2:channel_layout=stereo[a]" \
-map '[v]' -map '[a]' ace-ventura-reversal-truth.mp4
第一个 FFmpeg 命令中的滤镜会反转视频和音频流。[注意:这些滤镜消耗大量内存。请使用短片段。] 第二个 `FFmpeg` 命令中的滤镜将两个视频并排放置,以查看它们是否匹配。具体来说,原始视频的音频流在左声道播放,而反转视频的音频在第二个声道播放。您可能需要滑动音量控制工具的音频平衡,以便只听到其中一个音频流。
某些滤镜不需要任何输入。它们可以使用某些内置的滤镜变量来生成音频或视频输出。在这个命令中,`testsrc` 滤镜从无到有地生成一个视频测试图案。`aevalsrc` 使用代数方程生成随机白噪声。[注意:`-f lavfi` 开关允许您将滤镜输出用作伪输入文件。]
ffmpeg -f lavfi \
-i "testsrc=size=320x260[out0];aevalsrc=random(0)/20[out1]" \
-t 0:0:30 -pix_fmt yuv420p \
test.mp4
在下一个示例中,内置滤镜变量 `iw` 和 `ih` 用于调整一系列编号图像的大小并创建幻灯片视频——这些变量代表当前由滤镜处理的图像的实际尺寸。[注意: 使用逗号而不是分号,表示左侧滤镜的所有输出都被右侧滤镜消耗。]
ffmpeg -y -framerate 1/3 -i image%02d.jpg \
-filter_complex "scale=eval=frame:w=640:h=480:force_original_aspect_ratio=decrease,
pad=640:480:(640-iw)/2:(480-ih)/2:yellow" \
-pix_fmt yuv420p -framerate 24 \
slide.mp4
您不会第一次就掌握 FFmpeg 滤镜。我肯定没有。但是,一旦我理解了如何使用它们,一个全新的世界就向我敞开了。无需使用昂贵的软件即可创建各种效果。FFmpeg 滤镜可以免费完成其中的大部分工作。
如果您对此文章中的任何内容不理解,请阅读我的免费电子书。它包含数百个示例和插图。所有内容都已详细解释。之后,您可以查阅 FFmpeg 文档,尽情使用它。
历史
- 2021 年 6 月 21 日:初始版本
- 2021 年 6 月 22 日:更新关于使用逗号而不是分号。