Быстрый способ извлечения изображений из видео с помощью FFmpeg

Быстрый способ извлечения изображений из видео с помощью FFmpeg

Я использую FFmpeg для извлечения изображений из видео, 1 кадр каждые 6 секунд:

Normal command on Dos ( Windows 8 OS) >  ffmpeg -i in.mkv -r 1/6 %4d.png

Занимает слишком много времени, так как скорость очень низкая, около 15-20.

Поэтому я использовалskip_frame nokey

ffmpeg -skip_frame nokey -i "in.mkv" -vsync 0 -frame_pts true -r 1/6 %4d.png

Это извлекает на более высокой скорости, около 200 (в десять раз быстрее).
Но проблема в том, что он пропускает много изображений и выдает ошибку:

приложение предоставило недопустимый, немонотонно увеличивающийся dts для мультиплексора в потоке

Поэтому я использовал эту команду:

ffmpeg -i in.mkv -vf "select='if(not(floor(mod(t,6)))*lt(ld(1),1),st(1,1)+st(2,n)+st(3,t));if(eq(ld(1),1)*lt(n,ld(2)+1),1,if(trunc(t-ld(3)),st(1,0)))'" -vsync 0 %4d.png

(Предоставлено здесь -Как захватить первые X кадров каждые X секунд в PNG с помощью FFmpeg?)

Это дает мне скорость 25-30.

Можно ли как-то добиться более высокой скорости -skip_frame?

решение1

Хорошо, код, который я разместил выше в оригинальном посте, — единственное решение, которое я нашел для более быстрого извлечения изображений. Иногда он дает мне скорость до 50.

ffmpeg -i in.mkv -vf "select='if(not(floor(mod(t,6)))*lt(ld(1),1),st(1,1)+st(2,n)+st(3,t));if(eq(ld(1),1)*lt(n,ld(2)+1),1,if(trunc(t-ld(3)),st(1,0)))'" -vsync 0 %4d.png

Если вас интересует случайное извлечение изображений (на основе ключевого кадра) для повышения скорости, используйте -skip_frame nokey.

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