FFmpeg. Конвертирование видео в webm.

09. июня 2018 ffmpeg 0

Вступление.

Появилась острая необходимость преобразовать видео в формат webm (VP8), чтобы посредством плагина от Ильи Чернецова для CRYENGINE 5 можно было воспроизвести видео внутри нашей игры — The Cursed Forest. Blender, который мы используем в том числе в качестве видеоредактора (он весьма хорош), не умеет конвертировать в webm, а использовать не пойми какие конвертеры очень не хотелось, которые часто просто GUI для FFmpeg… Хм, вот его и будем использовать.

 

О FFmpeg.

FFmpeg — это мультиплатформенный набор свободных утилит и библиотек с очень обширным функционалом, предназначенных для различного преобразования аудио и видео (кодирование и декодирование, вырезание фрагментов, преобразование кадра в изображение, сборка видео из изображений, добавление и удаление субтитров и многое другое). Основной утилитой является, собственно, ffmpeg. По умолчанию графический интерфейс отсутствует и все команды передаются через командную строку (терминал).

Для Windows можно скачать с официального сайта, а для Linux, скорее всего, будет в репозитории используемого дистрибутива (в репозитории Ubuntu и Rosa Fresh точно есть).

О FFmpeg на вики.

Официальная документация.

Во много исчерпывающая справка на русском языке от сообщества Ubuntu.

 

Работа с ffmpeg.

Примечание: Далее будет в основном описываться по работе из Linux, впрочем, для Windows почти так же и про это будет заметка ниже по тексту.

 

Вывести информацию о ffmpeg (версия, параметры сборки):
ffmpeg

Проверить список поддерживаемых форматов:
ffmpeg -formats

Посмотреть справку о кодеке (в данном случае о кодеке webm):
ffmpeg -h encoder=libvpx

Вывести информацию о видео, где -hide_banner скрывает лишнюю информацию о ffmpeg, оставляя только информацию о видео:
ffmpeg -i -hide_banner /путь_до_видео/myvideo.avi

 

Схема обработки видео через ffmpeg:

ffmpeg [опции источника] -i [источник в виде файла и пути до него] [основные опции] [видео и аудио кодеки и их опции] [преемник]

 

Конвертирование в webm.

Рассмотрим простой пример конвертирования видео из формата avi в формат webm.

ffmpeg -i "/путь_до_видео/myvideo.avi" -s 1280х720 -r 30 -c:v libvpx -b:v 1600K -crf 4 -c:a libvorbis -b:a 192K "/путь_вывода_видео/myvideo_out.webm"

Примечание: Кавычки нужны для правильного чтения интерпретатором пробелов в пути и названиях файлов.

 

Для Windows процесс во многом схож с Linux, но удобнее сделать bat-файл и прописать туда необходимые команды:
"C:\путь_до_ffmpeg\ffmpeg.exe" -i \путь_до_видео\myvideo.avi -s 1280х720 -r 30 -c:v libvpx -b:v 1600K -crf 4 -c:a libvorbis -b:a 192K "C:\путь_вывода_видео\myvideo_out.webm"

 

Описание опций.
Указать источник:
ffmpeg -i /путь_до_видео/myvideo.avi

Разрешение кадра. Если не указывать, то разрешение будет такое же, как у источника.
-s 1280х720

Количество кадров в секунду. Если не указывать, то значение будет взято из источника.
-r 30

Указать кодек для видеопотока (в данном случае указан кодек libvpx для webm):
-c:v libvpx

Указать битрейт в кбит/сек для видеопотока. Если не указывать, то значение будет взято из источника. Ещё стоит обратить внимание, что по умолчанию применяется переменный битрейт (VBR). Это означает, что кодек, следуя своим алгоритмам, будет стараться отсечь и/или сжать избыточные данные, поэтому указанный и фактический битрейт на выходе будут отличаться. Чтобы эта оптимизация не снижала фактическое качество видео (которое всё-таки не на 100% зависит от битрейта) или снижала более контролируемо, нужно указывать константу уровня качества (crf), речь о которой пойдёт ниже.
-b:v 1600K

Указать константу уровня качества. Минимальное значение 4, которое указывает кодеку, что нужно максимально стремиться к соблюдению указанного в -b:v битрейта. Максимальное значение 63, что означает минимальное качество — битрейт будет сильно снижен, не смотря на указанное значение в -b:v.

-crf 4

Указать кодек для аудиопотока ( в данном случае vorbis):
-c:a libvorbis

Указать битрейт для аудиопотока:
-b:a 192K

 

Вот и всё, быстро и ничего сложного.