ffmpeg: чрезвычайно точное извлечение сегментов видео

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 )

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

Спасибо!

keypulsations
источник

Ответы:

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 значение аналогично квантуется как поток видео.

Gyan
источник
Я новичок в этом. Как вы получили 1024 образца на кадр? Разве это не должно быть 48000/25 = 1920?
Chamath
Аудио сэмплы объединяются в свои собственные кадры, которые не зависят от видеоданных. Таким образом, в AAC есть 1024 * аудиосэмпла в каждом кадре. * есть другие варианты с 960 выборками на кадр. Но ffmpeg не поддерживает это.
Gyan