FFmpeg може захоплювати зображення з відео, які можна використовувати як ескізи для представлення відео. Найбільш розповсюджені способи їх дії відображаються у вікні FFmpeg .
Але я не хочу вибирати випадкові кадри через деякі інтервали. Я знайшов кілька варіантів за допомогою фільтрів на 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
.. не впевнений, чи це має значення.