FFmpeg. Конвертирование видео в webm.
Вступление.
Появилась острая необходимость преобразовать видео в формат webm (VP8), чтобы посредством плагина от Ильи Чернецова для CRYENGINE 5 можно было воспроизвести видео внутри нашей игры — The Cursed Forest. Blender, который мы используем в том числе в качестве видеоредактора (он весьма хорош), не умеет конвертировать в webm, а использовать не пойми какие конвертеры очень не хотелось, которые часто просто GUI для FFmpeg… Хм, вот его и будем использовать.
О FFmpeg.
FFmpeg — это мультиплатформенный набор свободных утилит и библиотек с очень обширным функционалом, предназначенных для различного преобразования аудио и видео (кодирование и декодирование, вырезание фрагментов, преобразование кадра в изображение, сборка видео из изображений, добавление и удаление субтитров и многое другое). Основной утилитой является, собственно, ffmpeg. По умолчанию графический интерфейс отсутствует и все команды передаются через командную строку (терминал).
Для Windows можно скачать с официального сайта, а для Linux, скорее всего, будет в репозитории используемого дистрибутива (в репозитории Ubuntu и Rosa Fresh точно есть).
Во много исчерпывающая справка на русском языке от сообщества 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
Вот и всё, быстро и ничего сложного.