Объединение нескольких файлов с помощью 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, похоже, "исправить" проблему, просто заново закодировав видео. Нехорошее решение.
Update
Я понял, что конкат не был проблемой. Исходный набор клипов имел неверные временные метки. Каким-то образом concat + encoding исправил проблему, но я не хочу, чтобы каждый раз повторно кодировал видео и терял качество.
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
m и -t
в разных местах вместе с -af apad -c:v copy
, и мне все еще не удалось сохранить продолжительность.
Вот полный вывод ffprobe
Вот оригинальный (красный) и сегмент (зеленый)
Подробные файлы примеров
Я записал образец видео, добавил команды, чтобы расколоть его, а затем конкатентно. http://davidpennington.me/share/audio_sync_test_video.zip