Мне нужно объединить несколько потоков (видео + аудио), все смещенные по сравнению друг с другом и разной длины, в файл с синхронизированными потоками. Используя фиктивный случай, я обнаружил, что следующая команда создаст файл с видео, сдвинутым на 10 секунд по сравнению с аудио, воспроизводимым во всю длину:
ffmpeg -i in.mp4 -itsoffset 10 -i in.mp4 -c copy -map 0:1 -map 1:0 -t <total_length_in_secs> out.mp4
, если флаг -t пропущен, оригиналПродолжительность будет сохранена, и vlc прекратит воспроизведение и эффективно урежет последние 10 секунд видеопотока. Однако при использовании mkv оно не будет усечено, а ожидаемая длина видео увеличивается на 10 сек. Кроме того, ffplay не будет усекать mp4, а будет проигрывать его до конца, но как только будет достигнута первоначальная конечная временная метка, временная метка «зависнет», и AV начнет набирать (отрицательные) увеличивающиеся значения. Вывод ffplay будет выглядеть следующим образом:
368.34 A-V: -6.124 fd= 14 aq= 0KB vq= 0KB sq= 0B f=0/0
также ffprobe представит исходную длительность:
Duration: 00:06:08.71, start: 0.000000, bitrate: 304 kb/s
, где должно быть 00: 06: 18.71. Я не эксперт, но я предполагаю, что в контейнере mp4 есть поле метаданных, которое указывает общую продолжительность. Есть ли способ обновить его, или я должен преобразовать файлы в mkv, чтобы избежать неправильной и запутанной индикации продолжительности?