免责声明:我不了解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
所有上述命令都导致合并的音频文件...但时间已关闭。
我做错了什么?
答案 0 :(得分:0)
我发现问题并且问题存在缺陷,但值得回答。
问题是,在合并之前,两个音频文件具有开始时间戳> 0
但是当文件合并时,它们被“归零”,因此它们的延迟启动时间被忽略,音频启动得太早。
然后解决方案是再次对音频进行编码,但这次添加一个等于开始延迟的延迟,这样当它被归零时你就得到了你需要的填充。
让我们再试一次:
你从两个acc文件开始,无论出于何种原因,它们的开始时间分别为3秒和5秒。
接下来,您将每个文件“归零”:
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