Я пытаюсь объединить несколько файлов вместе, используя ffmpeg concatenate demuxer. Однако окончательное видео не синхронизировано c.
Первые части идут из изображения stati c, которое преобразуется в 5-секундное видео следующим образом:
ffmpeg -r 30 -i 1.png -vf loop=loop=150:size=1:start=0 -pix_fmt yuv420p -c:v libx264 -preset superfast -tune stillimage loop.mp4
Затем Я добавляю тихий аудиопоток:
ffmpeg -i loop.mp4 -f lavfi -i anullsrc -map 0:v -map 1:a -ar 44100 -ac 2 -c:v copy -c:a aac -shortest silent.mp4
ffrobe для silent.mp4:
ffprobe -v quiet -show_entries stream=start_time,duration silent.mp4
[STREAM]
start_time=0.000000
duration=5.733333
[/STREAM]
[STREAM]
start_time=0.000000
duration=5.665011
[/STREAM]
, который уже показывает, что аудио- и видеопотоки имеют разную длительность.
Тогда Я готовлю входной файл concat, последняя строка - это видео с тем же размером и частотой кадров, а также с существующим аудиопотоком (44,1 кГц, стерео)
file silent.mp4
file silent.mp4
... (multiple lines, say 10)
file silent.mp4
file video.mp4
Чтобы убедиться, что входы имеют одинаковые параметры:
ffmpeg -i silent.mp4 -i video.mp4
ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'silent.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.29.100
Duration: 00:00:05.03, start: 0.000000, bitrate: 32 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 19 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 2 kb/s (default)
Metadata:
handler_name : SoundHandler
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.29.100
Duration: 00:00:43.03, start: 0.000000, bitrate: 1622 kb/s
Stream #1:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 1484 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #1:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : SoundHandler
Теперь, после объединения, окончательное видео не синхронизировано c со звуком (аудиопоток последней части начинается до завершения stati c части)
ffmpeg -f concat -i concat.txt -c copy result.mp4 (no warnings)
Я пытался заполнить аудиопоток тишиной как в l oop .mp4, так и в video.mp4, но это не помогло - оно случайным образом изменяет длительность и время начала как видео, так и аудиопотоков, и звук снова не синхронизируется c после concat .
Также Я не могу увеличить продолжительность части stati c (так что количество записей в concat.txt может быть уменьшено), потому что каждая часть stati c может отличаться - это только пример.