Дамп последнего кадра видеофайла с использованием 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, чтобы обойти эту проблему. Он отправлен здесь.