2015-02-10 3 views
-1

Я искал всюду, чтобы решить, как извлечь N изображений из видео с помощью FFmpeg. Все ответы включают воспроизведение с настройкой скорости (-r). Однако у меня есть некоторые фундаментальные проблемы со ставкой. Согласно документам, следующее должно производить один кадр в секунду.FFmpeg extract N изображений с видео

ffmpeg -i input.mov -f image2 -r 1 preview-%d.jpeg 

Если input.mov длится 7 секунд, я ожидаю получить 7 изображений. Тем не менее, я получаю 10. Я также пробовал на видео 119 секунд, но у меня было 122 изображения. Я получаю еще 3 изображения, чем ожидалось. Что мне не хватает?

Например, с этим ~ 3 секунды видео я получаю шесть кадров https://www.dropbox.com/s/8eke6q2gz1kgk1f/example.mov?dl=0

benblack$ ffmpeg -i example.mov -f image2 -r 1 preview-%d.jpeg 
ffmpeg version 2.1.4 Copyright (c) 2000-2014 the FFmpeg developers 
    built on Mar 2 2014 13:38:24 with Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn) 
    configuration: --prefix=/usr/local/Cellar/ffmpeg/2.1.4 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid 
    libavutil  52. 48.101/52. 48.101 
    libavcodec  55. 39.101/55. 39.101 
    libavformat 55. 19.104/55. 19.104 
    libavdevice 55. 5.100/55. 5.100 
    libavfilter  3. 90.100/3. 90.100 
    libavresample 1. 1. 0/1. 1. 0 
    libswscale  2. 5.101/2. 5.101 
    libswresample 0. 17.104/0. 17.104 
    libpostproc 52. 3.100/52. 3.100 
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'example.mov': 
    Metadata: 
    major_brand  : qt 
    minor_version : 0 
    compatible_brands: qt 
    creation_time : 2015-02-11 16:52:01 
    Duration: 00:00:02.83, start: 0.000000, bitrate: 736 kb/s 
    Stream #0:0(und): Video: h264 (Main) (avc1/0x31637661), yuv420p(tv, bt709), 638x468 [SAR 1:1 DAR 319:234], 726 kb/s, 59.29 fps, 60 tbr, 6k tbn, 12k tbc (default) 
    Metadata: 
     creation_time : 2015-02-11 16:52:01 
     handler_name : Core Media Data Handler 
[swscaler @ 0x7fdb13008c00] deprecated pixel format used, make sure you did set range correctly 
Output #0, image2, to 'preview-%d.jpeg': 
    Metadata: 
    major_brand  : qt 
    minor_version : 0 
    compatible_brands: qt 
    encoder   : Lavf55.19.104 
    Stream #0:0(und): Video: mjpeg, yuvj420p, 638x468 [SAR 1:1 DAR 319:234], q=2-31, 200 kb/s, 90k tbn, 1 tbc (default) 
    Metadata: 
     creation_time : 2015-02-11 16:52:01 
     handler_name : Core Media Data Handler 
Stream mapping: 
    Stream #0:0 -> #0:0 (h264 -> mjpeg) 
Press [q] to stop, [?] for help 
frame= 6 fps=0.0 q=0.0 Lsize=N/A time=00:00:06.00 bitrate=N/A dup=0 drop=162 
video:283kB audio:0kB subtitle:0 global headers:0kB muxing overhead -100.007598% 
+0

С 7-секундным видео вы должны получить 8 изображений. Вы должны считать одно изображение в нулевое время. – Tarik

+0

Пожалуйста, покажите полный, нечеткий вывод командной строки и, в идеале, предоставите образец файла. – slhck

+0

Добавлен пример – Ben

ответ

0

Я не знаю, почему -r не производит то, что я ожидал. Тем не менее, мне удалось извлечь N кадров, используя -vf и -vsync:

ffmpeg -i example.mov -f image2 -vsync vfr -vf "select='not(mod(n,17)')" -vframes 10 preview-%d.jpeg 

круглый (количество кадров в видео/количество кадров хотел) = 168/10 = 17. Число кадров в видео можно найти с помощью ffprobe:

ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -i example.mov 

установка vframes является ограничение количества кадров, так как из-за округления мы могли бы иногда генерировать больше одного кадра.

+0

Привет @Ben, для меня эта команда работает, как ожидается, как: FFmpeg -i $ видеофайле -vf кадров в секунду = 1/$ secondsPerFrame IMG_% d.jpg Источник: https://gitlab.com/ nvallaris/снимаемого разные рамы/BLOB/Master/capture-diff-frames.sh # L94 – Nick