Audio 如何使用ffmpeg合并两个音频文件,同时保持正确的计时

Audio 如何使用ffmpeg合并两个音频文件,同时保持正确的计时,audio,ffmpeg,video-editing,Audio,Ffmpeg,Video Editing,免责声明:我不理解ffmpeg,大部分只是复制命令 我有两个webm视频文件。它们的持续时间大约缩短了一秒钟 我将它们转换为mp4,一切正常: ffmpeg-acodec libopus-i 1.webm-r 10-cpu使用5-c:v libx264-crf 20-c:a aac-严格的实验性-日志级错误1.mp4 然后我从每个视频中提取音频,一切都很好。很好,我的意思是,当我自己播放音频文件时,它们与原始视频上的计时相匹配。我使用此命令提取音频: fmpeg-i 1.mp4-map 0:a-

免责声明:我不理解ffmpeg,大部分只是复制命令

我有两个webm视频文件。它们的持续时间大约缩短了一秒钟

我将它们转换为mp4,一切正常:

ffmpeg-acodec libopus-i 1.webm-r 10-cpu使用5-c:v libx264-crf 20-c:a aac-严格的实验性-日志级错误1.mp4

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

fmpeg-i 1.mp4-map 0:a-vn-acodec拷贝1AAudio.m4a

我现在有两个音轨,我想把它们组合成一个,我想“叠加”它们,我想保持它们原来的计时

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

我尝试了以下命令来合并音频:

ffmpeg-i1audio.m4a-i2audio.m4a-filter\u complex“[0:a][1:a]amerge=inputs=2[a]”-map[a]-c:a libfdk\u aac mergedaudio.m4a

ffmpeg-i2audio.m4a-i1audio.m4a-filter\u complex amix=inputs=2:duration=first mergedaudio.m4a

ffmpeg-i1audio.m4a-i2audio.m4a-filter\u complex amerge-ac2-c:a libfdk\u aac-vbr4 mergedaudio.m4a

以上所有命令都产生了一个合并的音频文件。。。但时间已经过了


我做错了什么?

我发现了这个问题,这个问题有缺陷,但值得回答

问题是,在合并之前,两个音频文件的开始时间戳>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:libfdk_aac 1zeroed.m4a

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

    新的音频文件1zeroed和2zeroed现在的开始时间为0,但在编码填充期间添加了填充,因此每次播放时,音频仅在应该的时候开始

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


    ffmpeg-i1zeroed.m4a-i2zeroed.m4a-filter\u complex amerge-ac2-c:libfdk\u aac-vbr4 mergedaudio.m4a

    显示merge命令的完整控制台输出,并在可能的情况下共享文件。