точность копирования кадров потока ffmpeg

точность копирования кадров потока ffmpeg

Я знаю, что это может быть невозможно, но я был бы признателен, если бы вы хотя бы поняли, что происходит.

У меня есть видео с принудительными ключевыми кадрами каждые 2 секунды. В идеале я надеялся получить идеальные по кадру фрагменты без необходимости перекодирования. Например:

ffmpeg -ss 00:00:00 -i original.mp4 -t 2 -c copy slices_0.mp4
ffmpeg -ss 00:00:02 -i original.mp4 -t 2 -c copy slices_1.mp4
ffmpeg -ss 00:00:04 -i original.mp4 -t 2 -c copy slices_2.mp4
...

Кажется, это не совсем работает.

Если вникнуть в это глубже, то похоже, что первый срез точный до кадра, но все последующее имеет небольшое смещение (могут быть и другие проблемы, но я сейчас сосредоточусь только на этом). Первый кадр выглядит нормально:

# same output
ffmpeg -ss 00:00:03 -i original.mp4 -vframes 1 o.png && md5 o.png
ffmpeg -ss 00:00:00 -i slices_1.mp4 -vframes 1 1.png && md5 1.png

Но все, что после этого, выключено:

# not the same output
ffmpeg -ss 00:00:04 -i original.mp4 -vframes 1 o.png && md5 o.png
ffmpeg -ss 00:00:01 -i slices_1.mp4 -vframes 1 1.png && md5 1.png

Что бы я ни делал, я получаю тот же результат. Если я посмотрю на PTS для оригинала для кадра 60, я получу 2.002000 (вместо 2). Но даже если я использую это для своего среза, я получу то же самое смещение.

Что происходит?

(Возможно, я не совсем понял, но мне также интересно, почему первый кадр 0_slices.mp4 имеет смещение PST/DST, хотя в оригинале его нет)

решение1

Если вам нужен покадровый поиск, попробуйте разместить -ssфлаг после входного файла.

Итак, что-то вроде этого:

ffmpeg -i original.mp4 -ss 00:00:04 -vframes 1 -f image2 0.png.

Размещение ssфлага перед входным файлом будет «грубой догадкой» с точки зрения PTS, но для работы необходимо привязать его к I-кадру. Это происходит гораздо быстрее, чем размещение флага ssпосле входного файла, но ценой меньшей точности.

Когда вы ставите ssфлаг после входного файла, FFmpeg будет декодировать от начала файла до -ssначала отсчета времени. Затем он сбрасывает всю информацию до начала отсчета времени ss... Так что это занимает гораздо больше времени, но должно быть точно.

Связанный контент