Я использовал FFmpeg для извлечения всех I-кадров из файла MKV/MP4, но FFmpeg, похоже, декодирует все кадры, чтобы сделать это, поэтому это занимает очень много времени, если видеофайл 1080p и длиннее 10 минут. Я хочу только, чтобы он переходил от I-кадра к I-кадру и выгружал их в файлы JPG/PNG. Кроме того, мне нужно знать временную метку I-кадра.
Другой вариант — использовать FFprobe для получения временных меток для всех I-кадров, но это также декодирует весь файл.
Я пытаюсь сделать что-то похожее на Avidemux. В Avidemux можно очень быстро переходить к каждому I-кадру, просто нажимая клавиши со стрелками вверх или вниз, но он делает это без декодирования всех B/P-кадров.
решение1
Использовать
ffmpeg -skip_frame nokey -i file -vsync 0 -frame_pts true out%d.png
skip_frame
сообщает декодеру, что нужно обрабатывать только ключевые кадры. -vsync 0
(в этой команде) сохраняет временные метки. -frame_pts
устанавливает числовую часть имени файла выходного изображения для представления временной метки. Для интерпретации числа требуется знать частоту кадров, например, если частота кадров равна 30, то имя изображения out75 соответствует временной метке 75/30 = 2,50 секунды. Вы можете добавить, -r 1000
если хотите, числа для представления миллисекунд.