5月27日 23:14

FFmpeg 怎么从视频中提取音频?

-vn 丢弃视频流,配合编码参数输出目标格式即可。核心命令:

bash
# 提取音频为 MP3(重新编码) ffmpeg -i input.mp4 -vn -q:a 0 -map a output.mp3 # 直接复制音频流(不重新编码,速度最快,质量无损) ffmpeg -i input.mp4 -vn -acodec copy output.aac

两条命令的关键区别:-acodec copy 原样拷贝音频流,不重新编码,适合只需从容器中剥离音频的场景;-q:a 0 会重新编码为 VBR 最高质量的 MP3,适合需要格式转换的场景。

常用参数说明

  • -vn:禁用视频流,只保留音频
  • -map a:映射所有音频流,防止视频流被误包含
  • -q:a N:VBR 质量等级,0 最高,2 中等
  • -b:a 192k:CBR 比特率,128/192/320 为常用值
  • -ar 48000:采样率
  • -ac 2:声道数(1 单声道,2 立体声)

多音频流处理

MKV、WebM 等容器可能包含多条音轨(不同语言),需用 -map 指定:

bash
# 提取第一条音频流 ffmpeg -i input.mkv -map 0:a:0 -c:a libmp3lame -q:a 2 output.mp3 # 提取第二条音频流 ffmpeg -i input.mkv -map 0:a:1 -c:a libmp3lame -q:a 2 output.mp3

先用 ffmpeg -i input.mkv 查看流索引,Stream #0:1 中的 1 即为音频流编号。

输出不同格式

bash
# WAV(无损,适合音频编辑) ffmpeg -i input.mp4 -vn -acodec pcm_s16le -ar 48000 -ac 2 audio.wav # AAC(适合网络传输和流媒体) ffmpeg -i input.mp4 -vn -c:a aac -b:a 128k audio.aac

提取指定时间段

bash
ffmpeg -i input.mp4 -vn -ss 00:01:30 -t 00:00:20 -acodec copy output.aac

-ss 起始时间,-t 持续时长。

批量提取

bash
for file in *.mp4; do ffmpeg -i "$file" -vn -acodec copy "${file%.mp4}.aac" done

常见问题

提取后音频无声:用 ffmpeg -i 确认源文件含音频流;尝试加 -f mp3 显式指定格式;某些容器需指定编码器如 -c:a libmp3lame

文件过大:VBR 用 -q:a 2 替代 -q:a 0;CBR 用 -b:a 128k 控制比特率。

提取后无法播放:输出格式和编码器要匹配,MP3 输出用 -c:a libmp3lame,AAC 输出用 -c:a aac,不要给 WAV 文件指定 AAC 编码器。

标签:FFmpeg