Я использую 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.