如何用 FFmpeg 从视频提取音频
FFmpeg 提取音频实操:MP3、AAC、FLAC、WAV,码率控制、多音轨选择、元数据保留与批量处理。

用 FFmpeg 从视频提取音频其实很直接 —— MP3、AAC、FLAC、WAV、Opus 想要哪种都行,码率、采样率、元数据全可控。不管是把视频里的播客抠出来、扒一首背景音乐,还是拿对白去做字幕和转录,这篇覆盖你能遇到的所有场景。
最简单的提取
直接流复制,不重新编码:
# 不重编码提取音频(保持原格式)
ffmpeg -i input.mp4 -vn -c:a copy output.aac
-vn关掉视频流(只要音频)-c:a copy音频原样复制(无损、瞬时)
得先知道源音频是什么编码器才能选对扩展名(不熟 FFmpeg 的先看入门指南)。先探一下:
# 查视频用的什么音频编码器
ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -of default=nw=1 input.mp4
输出可能是 codec_name=aac,那就用 .aac 或 .m4a。
提取成指定格式
MP3:通用兼容
# 192 kbps 的 MP3
ffmpeg -i input.mp4 -vn -c:a libmp3lame -b:a 192k output.mp3
# 用 VBR 质量模式(推荐)
ffmpeg -i input.mp4 -vn -c:a libmp3lame -q:a 2 output.mp3
MP3 VBR 范围 0-9:0 最好(约 245 kbps),9 最差(约 65 kbps),2 是甜点(约 190 kbps)。如果同时还要转视频格式,编码器和码率的概念是相通的。
AAC:Apple 和网页首选
# 192 kbps AAC
ffmpeg -i input.mp4 -vn -c:a aac -b:a 192k output.m4a
# 更高音质
ffmpeg -i input.mp4 -vn -c:a aac -b:a 256k output.m4a
Opus:同码率音质最好
低码率下 Opus 音质明显更好,尤其是语音。
# 128 kbps Opus(音质很好)
ffmpeg -i input.mp4 -vn -c:a libopus -b:a 128k output.opus
# 语音用低码率就够
ffmpeg -i input.mp4 -vn -c:a libopus -b:a 64k output.opus
FLAC:无损压缩
# FLAC,无损但比 WAV 小
ffmpeg -i input.mp4 -vn -c:a flac output.flac
WAV:未压缩
# PCM 16 位
ffmpeg -i input.mp4 -vn -c:a pcm_s16le output.wav
# PCM 24 位(更高精度)
ffmpeg -i input.mp4 -vn -c:a pcm_s24le output.wav
格式横向对比
| 格式 | 类型 | 128 kbps 音质 | 体积 | 适合场景 |
|---|---|---|---|---|
| MP3 | 有损 | 一般 | 小 | 通用播放 |
| AAC | 有损 | 较好 | 小 | Apple、网页、流媒体 |
| Opus | 有损 | 优秀 | 最小 | 网页、VoIP、播客 |
| Vorbis | 有损 | 一般 | 小 | 开源项目 |
| FLAC | 无损 | 完美 | 中 | 存档、发烧友 |
| WAV | 未压缩 | 完美 | 大 | 剪辑、制作 |
| ALAC | 无损 | 完美 | 中 | Apple 生态 |
码率和音质设置
码率怎么定
按内容类型和目标格式选:
| 内容 | MP3 | AAC | Opus |
|---|---|---|---|
| 语音/播客 | 96-128 kbps | 64-96 kbps | 48-64 kbps |
| 普通音乐 | 192 kbps | 128 kbps | 96-128 kbps |
| 高品质音乐 | 320 kbps | 256 kbps | 160-192 kbps |
| 存档 | 用 FLAC | 用 FLAC | 用 FLAC |
改采样率
提取时可以顺手改采样率:
# 降到 22050 Hz(语音够用)
ffmpeg -i input.mp4 -vn -c:a libmp3lame -b:a 96k -ar 22050 output.mp3
# 保持 CD 标准(44100 Hz)
ffmpeg -i input.mp4 -vn -c:a flac -ar 44100 output.flac
改声道
# 立体声转单声道(语音够用,文件减半)
ffmpeg -i input.mp4 -vn -c:a libmp3lame -b:a 96k -ac 1 output.mp3
# 强制立体声
ffmpeg -i input.mp4 -vn -c:a aac -b:a 192k -ac 2 output.m4a
提取指定的那条音轨
视频可能有多条音轨——多语言、评论音轨之类。用 -map 选:
# 列出文件里所有流
ffprobe -v error -show_streams -of json input.mkv | grep -E "index|codec_name|codec_type|language"
# 提取第一条音轨
ffmpeg -i input.mkv -map 0:a:0 -c:a copy output_track1.aac
# 提取第二条音轨
ffmpeg -i input.mkv -map 0:a:1 -c:a copy output_track2.aac
# 所有音轨各存一个文件
ffmpeg -i input.mkv -map 0:a:0 track1.mp3 -map 0:a:1 track2.mp3
0:a:0 的写法:第一个输入文件(0)、音频流(a)、第一条音频流(0)。
只要某段时间的音频
# 1:30 到 3:45
ffmpeg -i input.mp4 -vn -ss 00:01:30 -to 00:03:45 -c:a libmp3lame -b:a 192k output.mp3
# 前 60 秒
ffmpeg -i input.mp4 -vn -t 60 -c:a copy output.aac
-ss 放在 -i 之前定位更快但可能不准;放在 -i 之后是帧精确定位。
元数据怎么处理
FFmpeg 默认会带过来。也可以显式控制:
# 显式保留全部元数据
ffmpeg -i input.mp4 -vn -c:a libmp3lame -b:a 192k -map_metadata 0 output.mp3
# 添加或覆盖元数据
ffmpeg -i input.mp4 -vn -c:a libmp3lame -b:a 192k \
-metadata title="第 42 期" \
-metadata artist="我的播客" \
-metadata album="第二季" \
-metadata date="2026" \
output.mp3
# 清空所有元数据
ffmpeg -i input.mp4 -vn -c:a libmp3lame -b:a 192k -map_metadata -1 output.mp3
顺手把封面也带上
# 把视频缩略图当成专辑封面嵌进 MP3
ffmpeg -i input.mp4 -vn -c:a libmp3lame -b:a 192k \
-c:v copy -disposition:v attached_pic output.mp3
把视频的第一帧(MV 通常就是封面)嵌入为专辑封面。
批量提取
整个目录都提一遍
# 所有 MP4 提成 MP3
for f in *.mp4; do
ffmpeg -i "$f" -vn -c:a libmp3lame -b:a 192k "${f%.mp4}.mp3"
done
# 各种视频格式提成 AAC
for f in *.mp4 *.mkv *.avi *.mov; do
[ -f "$f" ] || continue
name="${f%.*}"
ffmpeg -i "$f" -vn -c:a aac -b:a 192k "${name}.m4a"
done
带画质档位的批量脚本
#!/bin/bash
# 当前目录所有视频提取音频
# 用法: ./extract_audio.sh [quality]
# quality: low (96k), medium (192k), high (320k), lossless
QUALITY="${1:-medium}"
case "$QUALITY" in
low) CODEC="-c:a libmp3lame -b:a 96k"; EXT="mp3" ;;
medium) CODEC="-c:a libmp3lame -b:a 192k"; EXT="mp3" ;;
high) CODEC="-c:a libmp3lame -b:a 320k"; EXT="mp3" ;;
lossless) CODEC="-c:a flac"; EXT="flac" ;;
esac
for f in *.mp4 *.mkv *.avi *.mov *.webm; do
[ -f "$f" ] || continue
echo "正在提取: $f"
ffmpeg -i "$f" -vn $CODEC "${f%.*}.$EXT"
done
顺手调音量
提取时可以加滤镜调音量或做响度归一化:
# 音量 +50%
ffmpeg -i input.mp4 -vn -c:a libmp3lame -b:a 192k -af "volume=1.5" output.mp3
# 音量减半
ffmpeg -i input.mp4 -vn -c:a libmp3lame -b:a 192k -af "volume=0.5" output.mp3
# 响度归一化(EBU R128 标准)
ffmpeg -i input.mp4 -vn -c:a libmp3lame -b:a 192k \
-af "loudnorm=I=-16:TP=-1.5:LRA=11" output.mp3
loudnorm 在播客和语音内容里特别有用,能保证不同片段听起来音量一致。更多压缩相关的内容看视频压缩最佳实践。
直接从 URL 提取
FFmpeg 可以直接吃 URL:
# 从视频 URL 提取音频
ffmpeg -i "https://example.com/video.mp4" -vn -c:a libmp3lame -b:a 192k output.mp3
常见坑
流复制出来的文件打不开:编码器和容器不匹配。比如 Opus 音频用 -c:a copy 提到 .mp3 是不行的。换扩展名或者重编码。
输出是静音的:视频可能有多条音轨,默认那条是空的。先 ffprobe 看清楚再 -map 选。
"Discarding packet" 警告:通常没事。如果音频确实坏了,别流复制,直接重编码。
音画不同步:加 -async 1 修时间:
ffmpeg -i input.mp4 -vn -async 1 -c:a libmp3lame -b:a 192k output.mp3
小结
- 用
-c:a copy不重编码(最快、无损) - 通用兼容选 MP3,最佳音质选 Opus,无损选 FLAC
- 用
ffprobe先看清音轨结构再提 - 用
-map 0:a:N选指定音轨 - 用
-af loudnorm做响度归一化 - 整目录交给批量脚本
常见问题(FAQ)
怎么不重新编码就把 MP4 的音频抽出来?
用 ffmpeg -i input.mp4 -vn -c:a copy output.aac。-vn 把视频流去掉,-c:a copy 保持原始音频比特流不变(无损、瞬间完成)。输出扩展名要跟源里的编码对得上,先用 ffprobe -v error -select_streams a:0 -show_entries stream=codec_name input.mp4 看一下里面是什么。
播客用什么音频格式最合适?
纯人声播客首选 Opus,48–64 kbps,音质好且文件大小只有 MP3 的一半左右。要兼容所有播放器和平台就用 MP3,128 kbps —— 最稳。AAC,96 kbps 介于两者之间,对苹果生态和现代浏览器都友好。
FFmpeg 能直接从视频 URL 提音频吗?
可以,FFmpeg 接 HTTP(S) URL:ffmpeg -i "https://example.com/video.mp4" -vn -c:a libmp3lame -b:a 192k output.mp3。不用先下载视频,只要 FFmpeg 能 probe 到的链接都行。
多音轨视频里怎么挑指定那一条?
用 -map 0:a:N,N 是音轨编号(从 0 开始)。比如 ffmpeg -i input.mkv -map 0:a:1 -c:a copy second_track.aac 抽第 2 条音轨。先用 ffprobe -v error -show_streams input.mkv 把所有音轨和语言标签列一遍。
提出来的音频是静音或者破的怎么办?
大概率是默认音轨本来就是空的(屏幕录像或者多语音轨视频常见)。ffprobe 看清楚有哪几条音轨,用 -map 0:a:N 选对的那条。看到 "discarding packet" 警告就别再 -c:a copy,换 -c:a libmp3lame 强制重编码。
无损(FLAC)还是有损(MP3)?
要归档、要后续剪辑、源本身是无损的——用 FLAC。日常播放、播客、分享、网页——用 MP3 或 Opus,体积差异比可感知的音质差异大得多(192 kbps MP3 / 96 kbps Opus 已经过了人耳阈值)。
延伸阅读
- 如何用 FFmpeg 转换视频格式 — MP4、MKV、WebM 之间互转
- 如何用 FFmpeg 压缩视频 — 用 CRF、preset、编码器选择把体积压下来
- 如何用 FFmpeg 给视频加字幕 — 烧入或嵌入字幕轨