FFmpeg 媒体文件转换快速指南

FFmpeg 是一个很棒的工具,可以快速更改 AV 文件的格式或质量、提取音频、创建 GIF 等。
978 位读者喜欢这个。
Yellow arrows going both ways with texture

Jen Wike Huger 拍摄照片

有很多开源工具可以用来编辑、调整和转换多媒体,以满足您的确切需求。像 AudacityHandbrake 这样的工具非常棒,但有时您只想快速地将一个文件从一种格式转换为另一种格式。FFmpeg 就派上用场了。

FFmpeg 是处理多媒体文件的不同项目的集合。它经常在许多其他媒体相关项目的幕后使用。尽管它的名字如此,但它与运动图像专家组或它创建的无数多媒体格式无关。

在本文中,我将通过命令行工具 ffmpeg 使用 FFmpeg,这只是 FFmpeg 项目的一个小部分。它在许多不同的操作系统上都可用,并且默认包含在某些操作系统中。它可以从 FFmpeg 网站或通过大多数软件包管理器下载。

FFmpeg 是一个强大的工具,几乎可以处理您能想到的任何多媒体文件操作。在本文中,我们有兴趣使用它来转换文件,因此我们不会深入探讨它的整个功能集。在我们了解如何使用 FFmpeg 之前,首先我们需要快速了解一下媒体文件到底是什么。

媒体文件

从非常高的层面来看,媒体文件被分解为一个容器及其流。流包括实际的 AV 组件,例如电影的音频或视频,并使用特定的媒体编码或 编解码器进行编码。每个编解码器都有自己的属性、优点和缺点。例如,FLAC 编解码器适用于高质量无损音频,而 Vorbis 旨在在文件大小上与 MP3 竞争,同时提供更好的音质。这意味着 FLAC 格式的文件将比 Vorbis 音频流大得多,但听起来应该更好。两者本身都没有优劣之分,因为每个都在尝试做不同的事情。

容器是流的包装器。它呈现一个媒体播放器和工具可以与之交互的单一界面。有些容器非常先进,允许任何类型的流,包括单个容器内的多个视频和音频流。容器中的流不一定只是音频或视频。不同的容器将允许不同的流,例如,字幕、章节信息或其他元数据。这一切都取决于容器设置为允许什么。

这是媒体文件的抽象表示,跳过了容器之间的大量差异。许多容器需要特定的流和元数据,或者对允许的编解码器或内容施加限制。这个解释足以让您理解本文。要了解更多信息,请单击上面的链接。

请注意,视频和音频编码可能需要很长时间才能运行。当您使用 FFmpeg 时,您应该做好等待一段时间的准备。

基本转换

在音频和视频转换方面,让大多数人感到困惑的是选择正确的格式和容器。幸运的是,FFmpeg 的默认设置非常智能。通常它会自动选择正确的编解码器和容器,而无需任何复杂的配置。

例如,假设您有一个 MP3 文件,并且想要将其转换为 OGG 文件

ffmpeg -i input.mp3 output.ogg

此命令采用名为 input.mp3 的 MP3 文件,并将其转换为名为 output.ogg 的 OGG 文件。从 FFmpeg 的角度来看,这意味着将 MP3 音频流转换为 Vorbis 音频流,并将此流包装到 OGG 容器中。您不必指定流或容器类型,因为 FFmpeg 为您计算出来了。

这也适用于视频

ffmpeg -i input.mp4 output.webm

因为 WebM 是一种定义明确的格式,所以 FFmpeg 会自动知道它可以支持哪些视频和音频,并将流转换为有效的 WebM 文件。

根据您选择的容器,这并非总是有效。例如,像 Matroska 这样的容器旨在处理几乎任何您想要放入其中的流,无论它们是否有效。这意味着命令

ffmpeg -i input.mp4 output.mkv

可能会导致文件具有与 input.mp4 相同的编解码器,这可能不是您想要的。

选择您的编解码器

那么,当您想要使用像 Matroska 这样的容器(它可以处理几乎任何流),但仍然影响输出中的编解码器时,您该怎么办?FFmpeg 来救援!您可以使用 -c 标志选择所需的编解码器。

此标志允许您为每个流设置要使用的不同编解码器。例如,要将音频流设置为 Vorbis,您可以使用以下命令

ffmpeg -i input.mp3 -c:a libvorbis output.ogg

同样可以更改视频和音频流

ffmpeg -i input.mp4 -c:v vp9 -c:a libvorbis output.mkv

这将创建一个 Matroska 容器,其中包含 VP9 视频流和 Vorbis 音频流,基本上与我们之前制作的 WebM 相同。

命令 ffmpeg -codecs 将打印 FFmpeg 知道的每个编解码器。此命令的输出将根据您安装的 FFmpeg 版本而变化。

更改单个流

您可能经常遇到这样的情况:您拥有的文件部分正确,只有一个流的格式错误。重新编码正确的流可能非常耗时。FFmpeg 可以帮助您解决这种情况

ffmpeg -i input.webm -c:v copy -c:a flac output.mkv

此命令将视频流从 input.webm 复制到 output.mkv 中,并将 Vorbis 音频流编码为 FLAC。-c 标志非常强大。

更改容器

先前的示例可以应用于音频和视频流,允许您从一种容器格式转换为另一种容器格式,而无需进行任何额外的流编码

ffmpeg -i input.webm -c:av copy output.mkv

影响质量

现在我们已经掌握了编解码器,下一个问题是:我们如何设置每个流的质量?

最简单的方法是更改比特率,这可能会也可能不会导致不同的质量。人类的视觉和听觉能力并不像我们想象的那么干净和清晰。有时更改比特率会对主观质量产生巨大影响。有时它可能什么都不做,只是改变文件大小。有时很难说会发生什么,除非尝试一下。

要设置每个流的比特率,您可以使用 -b 标志,它的工作方式与 -c 标志类似,不同之处在于您设置的是比特率而不是编解码器选项。

例如,要更改视频的比特率,您可以使用如下命令

ffmpeg -i input.webm -c:a copy -c:v vp9 -b:v 1M output.mkv

这将从 input.webm 复制音频 (-c:a copy),并将视频转换为 VP9 编解码器 (-c:v vp9),比特率为 1M/s (-b:v),所有这些都捆绑在 Matroska 容器 (output.mkv) 中。

我们可以影响质量的另一种方法是使用 -r 选项调整视频的帧速率

ffmpeg -i input.webm -c:a copy -c:v vp9 -r 30 output.mkv

这将创建一个新的 Matroska,其中音频流被复制过来,视频流的帧速率被强制设置为每秒 30 帧,而不是使用来自输入的帧速率 (-r 30)。

您还可以使用 FFmpeg 调整视频的尺寸。最简单的方法是使用预定的视频尺寸

ffmpeg -i input.mkv -c:a copy -s hd720 output.mkv

这会将输出中的视频修改为 1280x720,但如果您愿意,可以手动设置宽度和高度

ffmpeg -i input.mkv -c:a copy -s 1280x720 output.mkv

这会产生与之前命令完全相同的输出。如果您想在 FFmpeg 中设置自定义尺寸,请记住宽度参数 (1280) 在高度 (720) 之前。

调整帧速率和比特率是影响媒体质量的两种粗略但有效的技术。如果现有源的质量已经很低,则将这些值设置得非常高也无法提高其质量。

更改这些设置对于快速降低高质量流以制作更小的文件大小最有效。调整视频的大小不能提高质量,但可以使其更适合平板电脑而不是电视。将 640x480 视频的大小更改为 4K 不会提高其质量。

更改文件的质量是一个非常主观的问题,这意味着没有一种方法每次都有效。最好的方法是进行一些更改并测试它是否对看起来或听起来更好。

修改流

通常,您有一个几乎完美的文件,您只需要修剪掉一些部分。使用显示您正在更改的内容的工具可以更轻松地完成此操作,但如果您确切知道要修剪的位置,则在 FFmpeg 中非常容易做到

ffmpeg -i input.mkv -c:av copy -ss 00:01:00 -t 10 output.mkv

这将复制视频和音频流 (-c:av copy),但会修剪视频。-t 选项将剪切持续时间设置为 10 秒,-ss 选项设置视频的修剪起始点,在本例中为一分钟 (00:01:00)。您可以比小时、分钟和秒更精确,如果需要,可以精确到毫秒。

提取音频

有时您并不真正在意视频,您只是想要音频。幸运的是,在 FFmpeg 中使用 -vn 标志非常简单

ffmpeg -i input.mkv -vn audio_only.ogg

此命令仅从输入中提取音频,将其编码为 Vorbis,并将其保存到 audio_only.ogg 中。现在您有了一个独立的音频流。您还可以以相同的方式使用 -an-sn 标志来剥离音频和字幕流。

制作 GIF

最近,动画 GIF(发硬 g 音,因为我不是怪物)卷土重来。我个人认为 GIF 是您可以为视频选择的最糟糕的格式。它的压缩质量和大小很差;对颜色、帧速率和容器元数据有非常严格的限制;并且不支持音频。尽管如此,它还是很受欢迎。那么,如何将视频剪辑制作成动画 GIF 呢?

如果您想制作没有音频的视频,使用 -an 标志(类似于我们上面所做的)比创建动画 GIF 更好,但是有很多地方支持 GIF,但不支持不同的视频格式。对于所有这些情况

ffmpeg -i input.mkv output.gif

此命令创建一个与输入文件尺寸相同的 GIF。这通常不是一个好主意,因为相对于其他视频格式,GIF 的压缩效果不佳(根据我的经验,GIF 的大小将是源视频的八倍左右)。使用 -s 选项将 GIF 调整为更小的尺寸可能会有所帮助,尤其是在输入源非常大的情况下,例如高清视频。

其他工具

虽然 FFmpeg 是大多数 AV 任务的首选工具,但它并非在所有方面都完美。有一些工具与 FFmpeg 结合使用,可以使一切变得更容易一些。

从 YouTube 下载视频

将内容上传到 YouTube 可能非常容易,丢失原始源视频,只剩下 YouTube 版本。检索 YouTube 视频副本的最简单方法是什么?

Youtube-dl 是一个很棒的小工具,您可以使用它从 YouTube 和其他几个视频流服务中抓取视频。它非常容易使用

youtube-dl https://www.youtube.com/watch?v=2m5nW9CQLJ0

此命令下载指示 URL 处的视频并将其保存在本地。

Youtube-dl 有几个选项可以控制下载视频的质量和格式,但我发现使用上面的命令更容易。它将最高质量的音频和视频下载到一个文件中,然后我使用 FFmpeg 将它们转换为我想要的格式。

获取媒体信息

有时您只需要知道媒体容器内部的内容。虽然有几种工具可以做到这一点,但我首选的工具是 MediaInfo。MediaInfo 显示媒体容器内的所有信息,包括每个不同流的信息以及输入文件的元数据。这为您提供了您可能想知道的一切——以及可能一堆您不想知道的东西。

运行命令 mediainfo inputFile.mkv 会以人类可读的形式输出有关输入文件的信息列表。

以及更多...

这只是 FFmpeg 功能的冰山一角。幸运的是,FFmpeg 及其项目其他工具的文档非常好,值得查看。它将教您有关这只狗可以做的许多不同技巧的所有知识。

如果您正在寻找具有图形界面的多媒体转换工具,Handbrake 是一个非常好的工具,可在 Linux、Mac OS X 和 Windows 上使用。Handbrake 在幕后使用 FFmpeg(以及其他工具)。

User profile image.
Tim Nugent 假装自己是移动应用开发者、游戏设计师和博士生,现在他最近涉足假装自己是作家。

6 条评论

感谢这些提示!我有时会过度思考使用 Ffmpeg(如果仅仅是因为我不经常使用它),而这篇文章很好地解释了我在使用该软件时使用的大多数选项。

很棒的文章。我使用 -threads 选项来启用 FFmpeg 的线程。它通常会显着缩短编码时间。

嘿 Tim,很棒的文章!

最近我发现关于 ffmpeg 的一件有趣的事情...

我正在阅读一篇文章,该文章建议将 .wav 文件转换为 .flac,然后再转换回 .wav,听起来与原始文件不同。嗯,我想 - 这似乎很奇怪。

奇怪的是,使用 flac(1) 将 96/24 .wav 转换为 .flac,然后使用 ffmpeg 将 .flac 转换回 .wav,截断了样本大小为 16 位...

不确定为什么会这样。这也让我想到,如果重放增益存储在标签中(不确定这是否会发生,但我认为可能会),但在转换中丢失,则结果可能会因响度级别而听起来不同。

您好 TIm。

我使用了命令 youtube-dl -F https://sitepage.com 列出非 youtube 网站上的视频。

即使它不是 youtube 网站,它也可以显示可用格式的列表。

然后在通常显示 {youtube} 的地方,它正确地显示 [sitename]。它还正确显示了开源中显示的视频名称。显示了可用的格式流。

问题

我不知道视频所在的目录。它在源代码中没有清楚地显示。试图回忆起一个工具在源代码中找到它。

此外,对于非 youtube 网站,命令行上的 [youtube] 将被什么替换?会是 [sitename 吗?

这是下载非 youtube 网站文件的正确格式吗?

“sitename-dl -F hls-3500 http://directory/videoname

干杯。

您好,

所以我并不是 youtube-dl 方面的专家,但我知道它支持的网站不仅仅是 Youtube,所以它可能足够好。

-F 标志可能不是您想要的,因为它列出了可用格式,而不是视频。

如果您知道您想要的视频的 URL,那么只需“youtube-dl http://sitename/video”在十分之九的情况下都能正常工作。

Tim

回复 作者 Kyleandrew

谢谢 TIm。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.