
Я извлекаю фрагмент видеофайла длительностью 1 минута, начиная с 30-й минуты от начала, и добавляю субтитры из внешнего файла с помощью следующей команды:
ffmpeg -ss 1800 -i input_video.m4v -ss 1800 -i input_subtitle.srt -map 1:0 -c:a aac -c:v libx264 -c:s mov_text -crf 35 -preset slow -t 60 -avoid_negative_ts 1 output_video.mp4
Проблема, которую я получаю, заключается в том, что транскодированное видео имеет длительность 00:01:03.50
вместо ожидаемой 00:01:00.00
. И при воспроизведении такого видео с помощью VLC воспроизведение останавливается до того, как полоса прогресса достигает конца.
Длительность становится ровно 1 минутой, только если я удаляю ввод субтитров. Похоже, длительность выходного файла увеличивается, чтобы вместить последнюю фразу из субтитров, которая начинается в пределах определенного диапазона в 1 минуту.
Есть ли способ принудительно установить длительность выходного сигнала точно на значение, установленное во -d
флаге?
решение1
В зависимости от того, как ffmpeg анализирует файлы субтитров, вам доступны два варианта:
Вывод в MP4, но возможно пропуск субтитров:
ffmpeg -i input_video.m4v -i input_subtitle.srt -ss 1800 -c:a aac -c:v libx264 -c:s mov_text -crf 35 -preset slow -t 60 output_video.mp4
Это должно создать 60-секундный файл, но он пропустит все субтитры, которые начинаются до 1800-х, но выходят за его пределы.
Вывод в MKV:
ffmpeg -i input_video.m4v -i input_subtitle.srt -ss 1800 -c:a aac -c:v libx264 -c:s ass -crf 35 -preset slow -t 60 output_video.mkv
Здесь любые субтитры, начинающиеся до 1800-х и выходящие за их пределы, будут присутствовать и иметь соразмерную длину, т.е. если субтитр начинается в 1795 и заканчивается в 1802, то он будет длиться 2 секунды в выводе.
2-шаговый метод
ffmpeg -i subfile -ss 1800 -t 60 sub.ass
и
ffmpeg -ss 1800 -i video.mp4 -i sub.ass -c:s mov_text out.mp4
При этом извлекаются субтитры, соответствующие нужному видеофрагменту, а затем они мультиплексируются с видео.