如何合并两个音频文件,同时保留正确的时间与ffmpeg

时间:2017-08-30 15:20:39

标签: audio ffmpeg video-editing

免责声明:我不了解ffmpeg,大多只是复制命令

我有两个webm视频文件。他们的持续时间大约是一秒钟。

我将这些转换为mp4,一切都很好:

ffmpeg -acodec libopus -i 1.webm -r 10 -cpu-used 5 -c:v libx264 -crf 20 -c:a aac -strict experimental -loglevel error 1.mp4

然后我从每个视频中提取音频,一切都很好。很好,我的意思是,当我自己播放音频文件时,它们与原始视频的时间相匹配。我用这个命令来提取音频:

fmpeg -i 1.mp4 -map 0:a -vn -acodec copy 1audio.m4a

我现在有两个音轨,我想把它们组合成一个,我想“叠加”它们,我想保持时间和它们一样。

但是,每当我尝试组合音频时,时间都会关闭。 “秒”与原始单个音频文件不匹配。

我已经尝试过这些命令来合并音频:

ffmpeg -i 1audio.m4a -i 2audio.m4a -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map [a] -c:a libfdk_aac mergedaudio.m4a

ffmpeg -i 2audio.m4a -i 1audio.m4a -filter_complex amix=inputs=2:duration=first mergedaudio.m4a

ffmpeg -i 1audio.m4a -i 2audio.m4a -filter_complex amerge -ac 2 -c:a libfdk_aac -vbr 4 mergedaudio.m4a

所有上述命令都导致合并的音频文件...但时间已关闭。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我发现问题并且问题存在缺陷,但值得回答。

问题是,在合并之前,两个音频文件具有开始时间戳> 0

但是当文件合并时,它们被“归零”,因此它们的延迟启动时间被忽略,音频启动得太早。

然后解决方案是再次对音频进行编码,但这次添加一个等于开始延迟的延迟,这样当它被归零时你就得到了你需要的填充。

让我们再试一次:

  1. 你从两个acc文件开始,无论出于何种原因,它们的开始时间分别为3秒和5秒。

  2. 接下来,您将每个文件“归零”:

  3. ffmpeg -i 1audio.m4a -filter_complex "[0:a]adelay=3000[a0];[a0]amix=inputs=1[out]" -map "[out]" -ac 2 -c:a libfdk_aac 1zeroed.m4a

    ffmpeg -i 2audio.m4a -filter_complex "[0:a]adelay=5000[a0];[a0]amix=inputs=1[out]" -map "[out]" -ac 2 -c:a libfdk_aac 2zeroed.m4a

    新的音频文件,1zeroed和2zeroed现在有0开始时间,但在编码填充期间添加了填充,所以当每次播放时,音频只在它应该开始时开始。

    现在当你合并这两个文件时,一切都非常酷! : - )

    ffmpeg -i 1zeroed.m4a -i 2zeroed.m4a -filter_complex amerge -ac 2 -c:a libfdk_aac -vbr 4 mergedaudio.m4a