Я знаю, что это может быть невозможно, но я был бы признателен, если бы вы хотя бы поняли, что происходит.
У меня есть видео с принудительными ключевыми кадрами каждые 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
... Так что это занимает гораздо больше времени, но должно быть точно.