有很多开源工具可以用来编辑、调整和转换多媒体,以满足您的确切需求。像 Audacity 或 Handbrake 这样的工具非常棒,但有时您只想快速地将一个文件从一种格式转换为另一种格式。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(以及其他工具)。
6 条评论