用FFmpeg视频音频互转
音视频流的提取与合并是视频创作中的高频操作:
- 替换背景音乐:从视频中提取原声后,可替换为版权自由的背景音乐或音效,大幅改变视频的氛围和风格。
- 人声提取与混音:从采访或Vlog中提取人声轨道,配合背景音乐进行多轨混音,提升音频的专业层次感。
- 配音同步:将后期录制的配音与原始视频画面同步合成。注意配音的采样率和码率应匹配项目标准。
- 容器兼容性:不同的视频容器(MP4、MKV、MOV)对音频编码的支持不同。MP4最好搭配AAC音频,MKV则兼容更多格式。选择合适的容器确保播放兼容性。
FFmpeg 音视频提取与合并详解
🎯 提取音频(禁用视频流)
使用 -vn 参数可以禁用视频流,从而从视频文件中仅提取音频轨道。结合音频编码器可输出常见格式:
转 MP3:-acodec libmp3lame -q:a 2(-q:a 范围 0–9,数值越小质量越高)
转 AAC:-acodec aac -b:a 192k(-b:a 指定音频比特率)
典型用法:ffmpeg -i input.mp4 -vn -acodec libmp3lame -q:a 2 output.mp3
🎬 合并视频和音频(多输入流)
将无音视频文件与独立音频文件合并为新视频:
ffmpeg -i video.mp4 -i audio.aac -c copy output.mkv
两个 -i 分别指定视频输入和音频输入,FFmpeg 会自动匹配各自的流。-c copy 表示流复制模式,直接拷贝原始编码数据,无需重新编码,速度极快且无损。
📦 容器兼容性
MP4 容器对音频编码格式有严格限制,最佳搭配为 AAC 音频。若将 MP3 音频放入 MP4 容器,多数播放器无法正常解码。因此将音视频合并到 MP4 时,建议将音频转码为 AAC:
ffmpeg -i video.mp4 -i audio.mp3 -acodec aac -vcodec copy output.mp4
其中 -vcodec copy 保持视频流不重新编码,仅音频部分转码,兼顾效率与兼容性。
⚡ -c copy 流复制原理
-c copy(即 -codec copy)指示 FFmpeg 不对音视频流进行解码再编码,而是直接将已压缩的码流从输入容器拷贝到输出容器。这样做的好处:
① 零质量损失——没有编解码环节,原始数据完整保留;
② 极速处理——仅做封装格式转换,耗时远低于完整转码;
③ 适用场景——合并音视频、更改容器格式(如 MP4→MKV)、去除元数据等无需重编码的操作。
注意:若输入与输出的编码格式不兼容(如 MP3 放入 MP4),则不能使用 -c copy,必须指定编码器进行转码。
{{v.name}}
从 MP4 视频中提取并直接保存为 MP3,代码如下
$ ffmpeg -i input.mp4 -ss 00:01:30 -t 20 -vn -acodec libmp3lame -q:a 2 output.mp3
如果视频本身没有音频流,将视频和音频合并为新的视频,代码如下
$ ffmpeg -i video.mp4 -i audio.aac -c copy output.mkv
如果要保存到MP4容器,最好将音频流转为aac,否则有极大可能产生兼容性问题导致无法播放,代码如下
$ ffmpeg -i video.mp4 -i audio.mp3 -acodec aac -vcodec copy output.mp4
替换视频中的原有音轨,将视频和音频合并为新的视频,代码如下
$ ffmpeg -i video_with_audio.mp4 -i new_audio.mp3 -c:v copy -map 0:v:0 -map 1:a:0 output.mp4
当视频和音频的长度不一致时,FFmpeg 默认会以 -longest(最长)的流的时长为准,较短的流会在结束后静默或停留最后一帧。可以通过参数显式控制。
以最短的流的时长结束输出。例如,视频60秒,音频30秒,则输出视频时长30秒,代码如下
$ ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -shortest output.mp4
以最长的流的时长结束输出(默认)。例如,视频60秒,音频30秒,则输出视频时长60秒,代码如下
$ ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -longest output.mp4
可在每个 -i 前使用 -ss [起始时间] -t [持续时间] 参数,代码如下
$ ffmpeg -ss 00:00:10 -t 5 -i video.mp4 -ss 00:00:01 -t 5 -i audio.mp3 -c:v copy -c:a aac output.mp4
混合音频(保留原音并添加新音频),代码如下
$ ffmpeg -i video.mp4 -i bgm.mp3 -filter_complex "[0:a][1:a]amix=inputs=2:duration=first:dropout_transition=2[aout]" -map 0:v -map "[aout]" -c:v copy -c:a aac output.mp4