使用ffmpeg的concat命令将多个文件合并时,音频的时间戳或偏移会出现不匹配的情况。我已经尝试了几个视频,并注意到在h.264/MP4上都有同样的问题。
使用concat
并对视频进行编码似乎可以正常工作。由于ffmpeg进行了完整的转换计算,并且似乎一切都正确,因此音频保持同步。
然而,仅仅将视频拼接起来而没有任何转换或编码会导致同步问题逐渐增加。显然,与其仅仅将视频连接起来而不是编码它们,这样做会导致信息/质量的损失,因此我更愿意找到解决这个问题的方法。
我已经尝试过几个标志来解决这个基于时间戳的问题。然而,这些都似乎无法解决这个问题。
ffmpeg -f concat -fflags +genpts -async 1 -i segments.txt test.mov
ffmpeg -auto_convert 1 -f concat -fflags +genpts -async 1 -i segments.txt -c copy test2.mov
ffmpeg -f concat -i segments.txt -c copy -fflags +genpts test3.mp4
ffmpeg -f concat -fflags +genpts -async 1 -i segments.txt -copyts test4.mov
ffmpeg -f concat -i segments.txt -copyts test5.mov
ffmpeg -f concat -i segments.txt -copyts -c copy test6.mov
ffmpeg -f concat -fflags +genpts -i segments.txt -copyts -c copy test7.mov
注意:我在SO上找到的所有其他问题似乎都是通过重新编码视频来“解决”问题。这不是一个好的解决方案。
更新
我意识到连接(concat)并不是问题所在。原始片段集的时间戳不匹配。不知何故,连接+编码修复了问题,但我不想每次都重新编码视频并失去质量。
ffmpeg -y -ss 00:00:02.750 -i input.MOV -c copy -t 00:00:05.880 output.MOV
这导致了以下数据。
ffprobe -v quiet -show_entries stream=start_time,duration output.MOV
start_time=-0.247500
duration=6.131125
start_time=-0.257333
duration=6.155333
从那时起,我尝试在不同位置使用-to
和-t
与-af apad -c:v copy
,但我仍然无法使持续时间相同。
这里是完整的ffprobe输出
这里是原始(红色)与段落(绿色)的比较
详细示例文件
我录制了一个示例视频,添加了分割和连接命令。http://davidpennington.me/share/audio_sync_test_video.zip
-video_track_timescale
改变MOV/MP4的视频时间基准而无需重新编码。如果您粘贴输入文件的详细信息,那会很有帮助。 - Gyan