Я ищу хороший короткий простой способ создать серию миниатюр для любого данного видеофайла. Я почти там использую 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 : '{print $2}' | 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"
Это не должно быть на командной строке, это просто, что это всегда заканчивает тем, что было самым легким.
См. ffmpeg страницу справочника. Вы хотите -vframes
:
-vframes
число
Определите номер видеокадров для записи.
Также посмотрите этот пример кого-то делающего то же самое. Исходное сообщение отмечает это -r
кажется, не работает правильно с аргументами меньше чем один. Вместо этого предложение состоит в том, чтобы использовать этот вид командной строки для захвата одного кадра (где X проходит некоторое время искать вперед в файле):
ffmpeg -ss X -i input.movie.file -an -vframes 1 ouput.png
Затем используйте сценарии оболочки, чтобы циклично выполнить это и автоматически сгенерировать X на основе (a) сколько кадров Вы хотите захватить и (b) сколько времени видео. Так как Ваш старый сценарий в качестве примера уже находит (b), (a) единственный необходимый вход:
# generate NFRAMES frames in a movie 90 minutes long
mins=$(exiftool "$file" | grep "Duration" | awk -F : '{print $2}' | 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