我想合并音频文件(.wav或.au格式)与视频文件(.mp4格式)。
如何做到这一点呢? 了解到ffmpeg命令应该可以做合并,但是具体怎么做?
最佳解决方法
下面分三中情形分别说明:
合并音频和视频,给音频重新编码
例子来自this blog entry,下面的命令做了更改,使用了最新的语法:
ffmpeg -i video.mp4 -i audio.wav \
-c:v copy -c:a aac -strict experimental output.mp4
在这里,我们假定视频文件没有包含任何音频流,并且希望具有与输入格式相同的输出格式(此处为MP4)。
上述命令转码音频,因为MP4不能携带PCM音频流。如果需要,可以使用任何其他所需的音频编解码器,更多信息,请参阅AAC Encoding Guide。
如果您的音频或视频流较长,可以添加-shortest
选项,以便一个文件结束后ffmpeg将停止编码。
合并音频和视频,复制音频(不需要重新编码)
如果输出容器可以处理(几乎)任何编解码器(如MKV),那么可以简单地复制音频和视频流:
ffmpeg -i video.mp4 -i audio.wav -c copy output.mkv
合并音频和视频,替换音频流
如果输入的视频已经包含音频,并且想要替换它,需要告诉ffmpeg采取哪个音频流:
ffmpeg -i video.mp4 -i audio.wav \
-c:v copy -c:a aac -strict experimental \
-map 0:v:0 -map 1:a:0 output.mp4
map
选项使ffmpeg只使用来自第一个输入的第一个视频流和来自第二个输入的第一个音频流作为输出文件。
次佳解决方法
编码webms时也遇到了这个问题。如果音频流比视频流长,则必须剪切它。否则视频播放完时,音频继续播放,最后一个视频帧会以静止图像呈现直到音频结束。
要剪切任何一个流,可以在每个-i “file.ext”之前使用-ss [hh:mm:ss] -t [ss]。
- -ss […]定义要切割的起点
- -t […]以秒为单位定义段的长度
示例如下:
ffmpeg.exe -ss 00:00:10 -t 5 -i "video.mp4" -ss 0:00:01 -t 5 -i "music.m4a" -map 0:v:0 -map 1:a:0 -y out.mp4