FFmpeg может захватывать изображения из видео, которые можно использовать в качестве эскизов для представления видео. Наиболее распространенные способы сделать это описаны в FFmpeg Wiki .
Но я не хочу выбирать случайные кадры через определенные промежутки времени. Я нашел несколько вариантов использования фильтров в FFmpeg для захвата изменений сцены:
Фильтр thumbnail
пытается найти наиболее представительные кадры в видео:
ffmpeg -i input.mp4 -vf "thumbnail,scale=640:360" -frames:v 1 thumb.png
и следующая команда выбирает только кадры, которые имеют более 40% изменений по сравнению с предыдущими (и, вероятно, являются изменениями сцены), и генерирует последовательность из 5 PNG.
ffmpeg -i input.mp4 -vf "select=gt(scene\,0.4),scale=640:360" -frames:v 5 thumb%03d.png
Информационный кредит для вышеупомянутых команд Фабио Соннати . Второй показался мне лучше, так как я мог получить n изображений и выбрать лучшее. Я попробовал это, и это произвело то же самое изображение 5 раз.
Еще одно расследование привело меня к:
ffmpeg -i input.mp4 -vf "select=gt(scene\,0.5)" -frames:v 5 -vsync vfr out%02d.png
-vsync vfr
гарантирует, что вы получите разные изображения. Это по-прежнему всегда выбирает первый кадр видео, в большинстве случаев первый кадр имеет титры / логотип и не имеет смысла, поэтому я добавил -ss
3, чтобы отбросить первые 3 секунды видео.
Моя последняя команда выглядит так:
ffmpeg -ss 3 -i input.mp4 -vf "select=gt(scene\,0.5)" -frames:v 5 -vsync vfr out%02d.jpg
Это было лучшее, что я мог сделать. Я заметил, что, поскольку я выбираю только 5 видео, все они в основном с начала видео и могут упустить важные сцены, которые происходят позже в видео
Я хотел бы выбрать ваши мозги для любых других лучших вариантов.
mjpeg
кодировщик для меня, и я также проверил, jpegoptim
и exiv2
оба они отлично работают для меня со всеми результатами JPG из ваших примеров команд.
libopenjpeg
.. не уверен, если это имеет значение.