Есть несколько простых способов сделать скриншоты/миниатюры фильмов с помощью FFmpeg. Но зачем это делать в первую очередь?

  1. Возможно, вы захотите создать миниатюры для своих видео и показывать эти миниатюры пользователю, когда он прокручивает видео.
  2. Или вы можете сравнить два видео, выполнив параллельное сравнение — это довольно распространено в исследованиях сжатия видео.

FFmpeg предлагает очень простые методы для извлечения скриншотов или эскизов в любом месте видео (точнее, способ дампа кадров в любой выбранной вами точке).

Посмотрим, как!

Один снимок экрана/миниатюра с использованием -frames:v

Во-первых, давайте разберемся, как сделать один снимок экрана или миниатюру с помощью FFmpeg.

ffmpeg -i inputvideo.mp4 -ss 00:00:03 -frames:v 1 foobar.jpeg

Понять это очень просто! Вот оно -

  1. -ss — это команда поиска, и ее можно использовать для поиска нужной позиции. Для точного поиска вам нужно использовать поиск вывода, а не поиск ввода (т. е. поставить -ss перед входной последовательностью). Синтаксис для указания времени: HH:MM:SS.MILLISECONDS. Например, вы можете указать FFmpeg искать 01:02:03, то есть 3-ю секунду 2-й минуты 1-го часа фильма!
  2. -frames:v 1 говорит FFmpeg сделать только 1 снимок экрана. Обратите внимание, что -vframes устарело.
  3. затем вы указываете имя выходного файла (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

Здесь,

  1. мы используем фильтр select для извлечения кадра, если выражение в одинарных кавычках оценивается как ненулевое. Если выражение равно нулю, то фильтр select отбрасывает этот кадр.
  2. mod(A,B) возвращает модуль (остаток после деления) после деления A на B. Таким образом, если мы разделим 0 на 300, мы получим 0. Тогда 1/300 равно 1 и так далее.
  3. not инвертирует этот результат. Итак, если модуль равен нулю, то окончательный результат равен 1. Если модуль отличен от нуля, то результат оценивается как zero.
  4. На основе этой операции not фильтр select выбирает кадр.

Последовательность, которую я использую, имеет частоту кадров 30 fps. И мне нужен кадр каждые 10 секунд. Итак, я должен выбрать кадр из каждых 300 кадров, верно? Вот почему я использовал select='not(mod(n,300))'

Это дает мне очень точные эскизы, как вы можете видеть в галерее изображений ниже. Нажмите на изображения, чтобы развернуть их и увидеть временные метки.

В зависимости от частоты кадров вашей последовательности вы можете изменить показанную командную строку. Если вы не знаете частоту кадров вашего видео, вы можете узнать ее с помощью ffprobe.

ffprobe -show_entries format=duration globe-with-timestamp.mp4

Заключение

Вот и все — несколько простых способов создания миниатюр и скриншотов с помощью FFmpeg. Вы можете делать одиночные или периодические снимки экрана с высокой точностью до кадра!

До следующего раза будьте осторожны и не забудьте поделиться этой статьей и проверить мою работу на islesys.com