如何从 MP4 视频中提取 MP3 音频,无需上传
把视频中的声音提取成真正的 MP3,不用上传视频。下面说说它是怎么工作的,以及需要付出什么代价。
「提取音频」其实是两种不同的工作
第一种是解封装(demuxing)。视频文件是一个容器,里面装着相互独立的轨道,其中的音频轨道本身已经是编码完成的成品,通常是 AAC。解封装只是把这条轨道取出来,单独存成一个文件,通常是 .m4a。整个过程不解码也不重新编码,所以大约一秒钟就能完成,而且不会损失任何东西。
第二种是先解码再重新编码。音频轨道被解码还原成原始采样,这些采样再交给一个新的编码器,写出另一种格式。当目标需要视频里原本没有用过的编解码器时,就要用到这种方式,而 MP3 正是最常见的原因。
这个工具究竟做了什么
它读取整个视频文件,把它交给浏览器的音频解码器,再把解码后的采样传给 LAME,也就是大多数桌面音频软件内置的 MP3 编码器。LAME 在后台 worker 中运行,让页面在处理期间仍然可以使用,最终写出一个 192 kbps 的立体声 MP3。这正是前面说的第二种工作,所以您下载到的是这段配乐重新编码出来的 MP3,而不是视频里原有音频的副本。
第一次使用时,页面会下载编码器本身,大约 150 KB。之后的处理都在您自己的处理器上完成,在大多数笔记本电脑上比播放这段视频快好几倍,在手机上则会慢一些。
192 kbps 会让您损失什么
对大多数收听场景来说,损失很小。192 kbps 的 MP3 每分钟大约占 1.4 MB,所以一段 45 分钟的讲座压缩后大约是 65 MB,而不是未压缩音频所需的 450 MB。不过 MP3 终究是有损格式。编码器会丢掉它认为您听不出来的细节,如果视频的原始音轨已经是 AAC,那么结果就是有损编码的第二代产物。用普通耳机听,这很少能察觉出来。但如果这段音频以后还要剪辑再导出,损失就会累积。
这也有内存上的代价。整个视频文件会被读入内存,音频在编码开始前会被完整解码,并以 32 位浮点采样的形式保存,这就是这个工具把文件大小限制在 100 MB 的原因。短片段完全没问题。手机上录的长时间录音,就是浏览器标签页撑不住的地方。
什么时候不该选 MP3
如果音频接下来要进剪辑软件、DAW 或降噪流程,正确的输入格式是未压缩音频,MP3 只会在到达时被迫再解码一次。把一个有损文件编辑后再存成有损文件,等于白白浪费一代画质却没有任何好处。遇到这类工作,用下面的 ffmpeg 流复制命令保留视频的原始音轨,再在您的编辑软件里解码它。
转录工作也是类似的道理。Whisper 以及基于它的工具都需要纯 PCM,开始处理前会先把 MP3 解码,所以只有当文件必须先传到别处时,MP3 才有意义。
这个工具的局限
- 浏览器必须能解码这个文件。带 AAC 音频的普通 MP4 没问题,但不常见的编解码器、受保护的文件,以及部分 MKV 或 AVI 容器都不行。
- 只能输出一条音频轨道。如果影片有多条语言轨,您得到的是解码器自己选中的那一条,没法手动挑选。
- 不会做任何裁剪。您拿到的是完整长度的录音,需要之后自己在编辑软件里剪。
- 比特率固定在 192 kbps,没有可以调小文件或提高质量的选项。
- 没有标签,没有章节标记,没有封面图,只有采样数据,仅此而已。
什么时候该改用 ffmpeg
如果您想要原始音频完全不动,流复制才是诚实的答案。执行 ffmpeg -i video.mp4 -vn -c:a copy audio.m4a 会把 AAC 音轨直接从容器里取出来。大约一秒钟就能完成,文件很小,而且音频和视频里的内容逐比特相同,因为没有任何解码,也就谈不上任何劣化。
如果想要更可控的 MP3,ffmpeg 可以驱动同一个 LAME 编码器,让您自己设定质量:ffmpeg -i video.mp4 -vn -q:a 2 audio.mp3 会写出一个可变比特率的文件,通常落在 170 到 210 kbps 之间。处理长文件时,这两个命令都比浏览器标签页快,但都需要先安装软件。如果只是一段五分钟、您不想交给陌生网站处理的片段,浏览器反而是更快的路径。
视频不会离开您的电脑
什么都不会上传,这才是关键。会议录音、访谈、医疗问诊记录和家庭视频,正是那些您最不希望出现在别人处理队列里的文件,尤其是在一份您没法核实的保留政策之下。打开浏览器开发者工具的网络面板,做一次提取试试看。第一次使用时,您会看到 MP3 编码器库被下载下来;之后不会再看到任何携带您视频内容的请求,因为根本没有发出过这样的请求。