2

Я хочу извлечь фрагменты видео с чрезвычайно точной начальной и конечной точкой. К сожалению, я вижу точность только с точностью до одной сотой секунды.

ffmpeg -i kayak.mp4 -ss 00:00:00 -t 2.86953 kayak_segment.mp4

Хотя я ожидаю, что этот сегмент будет иметь продолжительность 2.86953 , анализ выведенного сегмента показывает 2.891 .

ffprobe -i kayak_segment.mp4 -show_format -v quiet | sed -n 's/duration=//p'

(возвращает 2.891000)

Как наилучшим образом убедиться, что длительность извлеченных сегментов видео максимально приближена к указанной? Я не беспокоюсь об аудио.

Спасибо!

1 ответ1

4

Видеопотоки и аудиопотоки не являются непрерывными, но квантованы, поэтому для постоянного видеопотока 25 кадров в секунду длительность может принимать значения 0.04 s x N где N - количество кадров. Если аудиокодек имеет частоту дискретизации AAC @ 48000, то при 1024 выборках на кадр длительность звука будет кратна 1024/48000 = 0.021333 s *.

Из-за того, как происходит кодирование AAC, в начале аудиопотока имеется аудиофрейм с молчанием / заполнением, длительность которого составляет 0.021333 s но время представления которого составляет -0.21333 . По format этот пакет учитывается (но не по длительности stream ).

Когда t используется для обрезки клипа, все кадры, временные метки представления которых меньше t проходят через. Длительность последнего видеокадра не обрезается, но длительность последнего аудиокадра может быть обрезана, но это тоже квантуется. Итак, итоговая длительность format будет, AFAIK, Sum of all durations of packets of the stream featuring the greatest PTS .

Если вас не интересует звук, вы можете удалить его (используйте -an) и увидите, что ваше значение t аналогично квантовано как видеопоток.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .