Дамп последнего кадра видеофайла с использованием ffmpeg/mencoder/transcode et. аль
Я хотел бы захватить последний кадр в видео (.mpg
, .avi
, что угодно) и выгрузить его в файл изображения (.jpg
, .png
, что угодно). Toolchain - это современная Linux-команда, поэтому такие вещи, как mencoder
, transcode
, ffmpeg
& c.
Cheers,
Боб.
Ответы
Ответ 1
Это не полное решение, но оно укажет вам по правильному пути.
Используйте ffprobe -show_streams IN.AVI
, чтобы получить количество кадров в видеовходе. Тогда
ffmpeg -i IN.AVI -vf "select='eq(n,LAST_FRAME_INDEX)'" -vframes 1 LAST_FRAME.PNG
где LAST_FRAME_INDEX - это количество кадров меньше единицы (кадры нулевые индексы), выведет последний кадр.
Ответ 2
Я не мог заставить решение Nelson работать. Это сработало для меня.
https://gist.github.com/samelie/32ecbdd99e07b9d8806f
EDIT (на всякий случай ссылка исчезает, вот shellscript-bobbogo):
#!/bin/bash
fn="$1"
of=`echo $1 | sed s/mp4/jpg/`
lf=`ffprobe -show_streams "$fn" 2> /dev/null | grep nb_frames | head -1 | cut -d \= -f 2`
rm -f "$of"
let "lf = $lf - 1"
ffmpeg -i $fn -vf select=\'eq\(n,$lf\) -vframes 1 $of
Ответ 3
Одна вещь, о которой я не упоминал, - это то, что ожидаемый отсчет кадров может быть отключен, если файл содержит обман. Если ваш метод подсчета кадров приводит к тому, что команда извлечения изображения возвращается в исходное состояние, это может быть то, что отбрасывает ее.
Я разработал короткий script, чтобы обойти эту проблему. Он отправлен здесь.