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 видео, все они в основном с начала видео и могут упустить важные сцены, которые происходят позже в видео
Я хотел бы выбрать ваши мозги для любых других лучших вариантов.
источник
libopenjpeg
.. не уверен, если это имеет значение.mjpeg
кодировщик для меня, и я также проверил,jpegoptim
иexiv2
оба они отлично работают для меня со всеми результатами JPG из ваших примеров команд.Ответы:
Как насчет поиска, в идеале, первого> 40% сменного кадра в каждом из 5 временных интервалов, где временные интервалы составляют 1, 2, 3, 4 и 5–20% видео.
Вы также можете разделить его на 6 временных периодов и игнорировать 1-й, чтобы избежать кредитов.
На практике это будет означать установку низкого значения fps при применении проверки смены сцены и вашего аргумента для удаления первого бита видео.
...что-то вроде:
источник
Unable to find a suitable output format for 'fps=fps=1/600'
. Решение состоит в том, чтобы добавить-vf
перед этим аргументом (см. Stackoverflow.com/questions/28519403/ffmpeg-command-issue )Трудно определить значимые значения, но если вы хотите, чтобы N миниатюр эффективно обрабатывало весь видеофайл, это то, что я использую для создания миниатюр в процессе работы с загруженным пользователем контентом.
Псевдо-код
Где:
ffmpeg -i <movie>
одного илиffprobe
с хорошим выходным писателем JSON, кстатиПросто вышеупомянутое записывает центральный ключевой кадр каждого раздела фильма. Например, если фильм имеет длину 300 с и вам нужно 3 миниатюры, тогда он занимает один ключевой кадр после 50 с, 150 с и 250 с. Для 5 миниатюр это будет 30, 90, 150, 210, 270. Вы можете настроить N в зависимости от продолжительности видеоролика D, например, в 5-минутном фильме будет 3 миниатюры, а в течение 1 часа - 20 миниатюр.
Представление
Каждый вызов вышеуказанной
ffmpeg
команды занимает долю секунды (!) Для ~ 1 ГБ H.264. Это потому, что он мгновенно переходит на<time>
позицию (-ss
перед умом-i
) и занимает первый ключевой кадр, который практически завершен в формате JPEG. Нет времени, потраченного на рендеринг фильма в соответствии с точным положением времени.Постобработка
Вы можете смешать выше с
scale
любым другим методом изменения размера. Вы также можете удалить сплошные цветные рамки или попытаться смешать их с другими фильтрами, какthumbnail
.источник
-ss N
до того-i
, это удивительный совет. благодарю вас!Однажды я сделал нечто подобное, но я экспортировал все кадры видео (с частотой 1 кадр / с) и сравнил их с обнаруженной мной утилитой perl, которая вычисляет разницу между изображениями. Я сравнил каждый кадр с предыдущими миниатюрами, и если он отличался от всех миниатюр, я добавил его в коллекцию миниатюр. Преимущество здесь в том, что если ваше видео перемещается со сцены A на B, а оно возвращается на A, ffmpeg будет экспортировать 2 кадра A.
источник
Попробуй это
С помощью этой команды я могу создать необходимое количество миниатюр, которые представляют все видео.
источник
fps
быть(no_of_frames_req * fps_of_vid) / total_video_frames
?Вот что я делаю для создания периодической миниатюры для живых потоков m3u8 для использования в качестве постера. Я обнаружил, что выполнение непрерывной задачи ffmpeg только для генерации миниатюр приводит к израсходованию всего моего процессора, поэтому вместо этого я запускаю cronjob каждые 60 секунд, который генерирует все миниатюры для моих потоков.
Если вам нужно делать чаще, чем 60 секунд (ограничение cronjob), тогда вы можете сделать
while
цикл в вашем скрипте, и он будет выполняться вечно. Просто добавьте,sleep 30
чтобы изменить частоту до 30 секунд. Я не рекомендую делать это с большим количеством видео, поскольку предыдущий запуск может не завершиться до начала следующего.В идеале с cronjob я просто запускаю его каждые 5 минут.
источник