Есть несколько простых способов сделать скриншоты/миниатюры фильмов с помощью FFmpeg. Но зачем это делать в первую очередь?
- Возможно, вы захотите создать миниатюры для своих видео и показывать эти миниатюры пользователю, когда он прокручивает видео.
- Или вы можете сравнить два видео, выполнив параллельное сравнение — это довольно распространено в исследованиях сжатия видео.
FFmpeg предлагает очень простые методы для извлечения скриншотов или эскизов в любом месте видео (точнее, способ дампа кадров в любой выбранной вами точке).
Посмотрим, как!
Один снимок экрана/миниатюра с использованием -frames:v
Во-первых, давайте разберемся, как сделать один снимок экрана или миниатюру с помощью FFmpeg.
ffmpeg -i inputvideo.mp4 -ss 00:00:03 -frames:v 1 foobar.jpeg
Понять это очень просто! Вот оно -
-ss
— это команда поиска, и ее можно использовать для поиска нужной позиции. Для точного поиска вам нужно использовать поиск вывода, а не поиск ввода (т. е. поставить-ss
перед входной последовательностью). Синтаксис для указания времени:HH:MM:SS.MILLISECONDS
. Например, вы можете указать FFmpeg искать01:02:03
, то есть 3-ю секунду 2-й минуты 1-го часа фильма!-frames:v 1
говорит FFmpeg сделать только 1 снимок экрана. Обратите внимание, что-vframes
устарело.- затем вы указываете имя выходного файла (
screenshot_10.jpg
).
Просто, не так ли? Теперь, когда вы знаете, как создавать отдельные миниатюры или снимки экрана, давайте перейдем к следующему разделу, где мы понимаем, как создавать обычные или периодические миниатюры.
Периодический снимок экрана/миниатюра с изменением размера
Вот еще один распространенный вариант использования, который может легко решить FFmpeg — как делать скриншоты/миниатюры через равные промежутки времени и сохранять их в файлы JPG после изменения их размера?
Вот простой однострочный инструмент, который может позаботиться о создании миниатюры и изменении ее размера.
ffmpeg -i input1080p.mp4 -r 1 -s 1280x720 -f image2 screenshot-%03d.jpg
Команда -r
устанавливает выходную частоту кадров (=1), а image2
— это мультиплексор файлов изображений, который используется для записи видеокадров в файлы изображений. Используя команду -s 1280x720
, мы можем изменить размер видеокадров, прежде чем записывать их как изображения. Обратите внимание, что входное видео имеет разрешение 1920x1080p.
Приведенная выше команда будет делать снимок экрана каждую секунду. Скриншоты будут называться 001
, 002
и т. д., потому что мы указали форматирование как %3d
.
Однако, по моему опыту, я обнаружил, что эта техника не обеспечивает точности кадра.
В следующем разделе мы рассмотрим более точный способ извлечения эскизов.
Скриншот/миниатюра каждые 10 секунд
В дополнение к предыдущему разделу давайте сделаем быстрое упражнение и узнаем, как создавать миниатюру каждые 10 секунд с помощью FFmpeg.
ffmpeg -i inputvideo.mp4 -vf "select='not(mod(n,300))',setpts='N/(30*TB)'" -f image2 thumbnail%03d.jpg
Здесь,
- мы используем фильтр
select
для извлечения кадра, если выражение в одинарных кавычках оценивается как ненулевое. Если выражение равно нулю, то фильтрselect
отбрасывает этот кадр. mod(A,B)
возвращает модуль (остаток после деления) после деления A на B. Таким образом, если мы разделим 0 на 300, мы получим 0. Тогда 1/300 равно 1 и так далее.not
инвертирует этот результат. Итак, если модуль равен нулю, то окончательный результат равен1
. Если модуль отличен от нуля, то результат оценивается какzero
.- На основе этой операции
not
фильтрselect
выбирает кадр.
Последовательность, которую я использую, имеет частоту кадров 30 fps
. И мне нужен кадр каждые 10 секунд. Итак, я должен выбрать кадр из каждых 300 кадров, верно? Вот почему я использовал select='not(mod(n,300))'
Это дает мне очень точные эскизы, как вы можете видеть в галерее изображений ниже. Нажмите на изображения, чтобы развернуть их и увидеть временные метки.
В зависимости от частоты кадров вашей последовательности вы можете изменить показанную командную строку. Если вы не знаете частоту кадров вашего видео, вы можете узнать ее с помощью ffprobe
.
ffprobe -show_entries format=duration globe-with-timestamp.mp4
Заключение
Вот и все — несколько простых способов создания миниатюр и скриншотов с помощью FFmpeg. Вы можете делать одиночные или периодические снимки экрана с высокой точностью до кадра!
До следующего раза будьте осторожны и не забудьте поделиться этой статьей и проверить мою работу на islesys.com