Миниатюры видео с использованием ffmpeg

13056
Michael Lenzen

Я ищу хороший короткий простой способ создать серию миниатюр для любого видеофайла. Я почти там использую ffmpeg, вот что у меня есть:

ffmpeg -i /tmp/video.avi -r 1 -ss 60 -r 1 foo-%03d.jpeg` 

Единственная проблема в том, что это занимает выстрел каждую секунду, и я хотел бы делать это каждую минуту или около того. Я попытался установить -rзначение 1/60или .02безрезультатно.

Для справки вот старый скрипт, который я использовал, который работал только для некоторых файлов:

#!/bin/bash # grab a screenshot every 60 seconds file=$1 orig_dir=`pwd` mins=`exiftool "$file" | grep "Duration" | awk -F : '' | grep --only-matching '[0-9]*'` dir="$file-screenshots" mkdir "$dir" cd "$dir" mplayer -vo png -vf screenshot -sstep 60 -frames $mins -ao null "../$file" cd "$orig_dir" 

Это не обязательно должно быть в командной строке, просто всегда получается проще.

3
Взгляните на этот вопрос http://superuser.com/questions/135117/how-to-convert-video-to-images/135238#135238 Возможно, с помощью найденной там информации вы сможете решить эту проблему. Если это так, ответьте на другой вопрос, поскольку он, вероятно, будет закрыт как дубликат. Nifle 14 лет назад 0

1 ответ на вопрос

3
quack quixote

Смотрите страницу руководства ffmpeg . Вы хотите -vframes:

-vframesномер
Установите количество видеокадров для записи.

Также посмотрите этот пример того, как кто-то делает то же самое. Исходное сообщение отмечает, что -r, кажется, не работает должным образом с аргументами меньше, чем один. Вместо этого предлагается использовать этот вид командной строки для захвата одного кадра (где X - некоторое время для поиска вперед в файле):

ffmpeg -ss X -i input.movie.file -an -vframes 1 ouput.png 

Затем используйте сценарии оболочки, чтобы зациклить это, и автоматически сгенерируйте X на основе (а) того, сколько кадров вы хотите захватить и (б) как долго будет длиться видео. Так как ваш старый пример сценария уже находит (b), (a) является единственным необходимым вводом:

# generate NFRAMES frames in a movie 90 minutes long  mins=$(exiftool "$file" | grep "Duration" | awk -F : '' | grep --only-matching '[0-9]*') dir="$file-screenshots" mkdir "$dir"  for i in $(seq 1 $NFRAMES); do ffmpeg -ss $(echo "$i * $mins" | bc -l) -i "$file" -an -vframes 1 "$dir/$i.png"; done