Объединение нескольких сдвинутых потоков с ffmpeg - ожидаемая продолжительность результата неверна - PullRequest
0 голосов
/ 28 октября 2019

Мне нужно объединить несколько потоков (видео + аудио), все смещенные по сравнению друг с другом и разной длины, в файл с синхронизированными потоками. Используя фиктивный случай, я обнаружил, что следующая команда создаст файл с видео, сдвинутым на 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, чтобы избежать неправильной и запутанной индикации продолжительности?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...