录制的讲座、以视频形式发布的播客、你只听不看的音乐会片段:有时你从MP4中想要的仅仅是它的音轨。ffmpeg 可以用一条命令完成此操作,并可完全控制输出质量。

本指南介绍如何使用 ffmpeg 将 MP4 转换为 MP3、选择合理的质量设置、无损提取音频以及批量转换文件。

前置条件

你需要安装 ffmpeg。在 Ubuntu、Debian 及其衍生版本上:

终端
sudo apt update
sudo apt install ffmpeg

这些命令会同时安装 ffmpeg 和 ffprobe。如需特定版本的安装说明,请参阅我们在 Ubuntu 和 Debian 上安装 ffmpeg 的指南。

将 MP4 转换为 MP3

最简单的形式是给 ffmpeg 一个输入,选择 LAME MP3 编码器,并命名输出文件:

终端
ffmpeg -i video.mp4 -c:a libmp3lame audio.mp3

此命令解码 video.mp4 中的音轨,使用默认设置将其编码为 MP3,并写入 audio.mp3。视频流会被自动丢弃,因为 MP3 文件无法包含视频流。

为了更好的控制,推荐的命令形式增加了两个选项:

终端
ffmpeg -i video.mp4 -vn -c:a libmp3lame -q:a 2 audio.mp3

-vn 标志显式丢弃视频流,-c:a libmp3lame 选择 LAME MP3 编码器,-q:a 2 选择可变比特率(VBR)质量等级 2。该等级平均约为 190 kb/s,但实际比特率取决于音频内容。

选择质量

MP3 编码器接受从 0(最佳)到 9(最小)的 VBR 质量等级。以下近似比特率随源文件不同而变化:

  • -q:a 0 - 约 245 kb/s;最高质量的 VBR,适用于你重视的音乐。
  • -q:a 2 - 约 190 kb/s;常见的最佳平衡点。
  • -q:a 5 - 约 130 kb/s;适合语音和播客。
  • -q:a 7 - 约 100 kb/s;文件较小,但音乐上会有可闻的压缩痕迹。

如果你需要恒定比特率,例如某些对 VBR 支持不佳的设备,请使用 -b:a:

终端
ffmpeg -i video.mp4 -vn -c:a libmp3lame -b:a 192k audio.mp3

请记住,编码无法恢复质量:如果源音频是 96 kb/s 的流,将其编码为 320 kb/s 只会生成更大的文件,而不会获得更好的音质。

无损提取音频

转换为 MP3 始终涉及重新编码,这会损失少量质量。如果你只需要原始音轨,请在决定是否转换前检查其编解码器:

终端
ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 video.mp4
输出
aac

AAC 音频在 MP4 文件中很常见,可以直接复制到 .m4a 容器中而无需重新编码:

终端
ffmpeg -i video.mp4 -map 0:a:0 -c:a copy audio.m4a

-map 0:a:0 选项选择第一个音轨,-c:a copy 在不进行解码或编码的情况下移动压缩音频。音频数据保持不变,此操作通常比 MP3 转换快得多。如果 ffprobe 报告其他编解码器,请使用兼容的容器或转而转换音频。

转换文件的一部分

要仅转换某一段,可将转换与开始时间和持续时间结合:

终端
ffmpeg -ss 00:05:30 -i video.mp4 -t 00:06:30 -vn -c:a libmp3lame -q:a 2 clip.mp3

-ss 选项从 5:30 开始,-t 00:06:30 转换接下来的六分三十秒,到 12:00 结束。这对于从音乐会录音中提取一首歌,或从长篇采访中提取一个回答非常方便。

批量转换多个文件

ffmpeg 一次只接受一个输入,因此转换目录中的多个 MP4 文件需要使用一个简短的 bash 循环:

终端
shopt -s nullglob
for f in *.mp4; do
  ffmpeg -n -i "$f" -vn -c:a libmp3lame -q:a 2 "${f%.mp4}.mp3"
done

nullglob 设置可在目录中无 MP4 文件时跳过循环。${f%.mp4} 展开会去除 .mp4 扩展名,使每个 MP3 保留原始文件名,而 -n 可防止覆盖现有文件。变量周围的双引号可保持包含空格的文件名完整。

故障排查

未知编码器 ’libmp3lame’
你的 ffmpeg 构建缺少 LAME MP3 编码器,某些精简版或受编解码器限制的软件包会出现此情况。使用 ffmpeg -hide_banner -encoders | grep -w libmp3lame 检查,然后安装包含该编码器的 FFmpeg 软件包。

输出文件没有声音
源文件可能包含多个音轨,且选择了错误的音轨。使用 ffprobe -hide_banner video.mp4 检查文件,然后使用 -map 显式选择音轨,例如 -map 0:a:1 选择第二个音轨。

无法写入 M4A 输出头
源音频编解码器与 M4A 容器不兼容。请使用支持原始编解码器的容器,或将 -c:a copy 替换为 -c:a aac -b:a 192k 以创建兼容的 M4A 文件。

输出文件已存在
FFmpeg 会在替换现有文件前询问。请使用不同的输出名称,添加 -n 保留现有文件,或仅在你确实想要覆盖时添加 -y。