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。

© . All rights reserved.