Кодирование видео WebM с ffmpeg

Автор: Евгений Рыжков и Татьяна Головко Дата публикации: 22.03.2011

Я пишу эту главу 20 мая 2010 года. Формат WebM был представлен буквально вчера. Поэтому пока еще нет большого выбора кодеров, да и мануалов по процессу кодирования тоже. Все это не понадобится, когда WebM получит глобальную поддержку, а пока нам нужны такие инструменты:

Итак, начнем. Из командной строки запускаем ffmpeg без параметров и убеждаемся, что есть поддержка VP8:

you@localhost$ ffmpeg
FFmpeg version SVN-r23197, Copyright (c) 2000-2010 the FFmpeg developers
built on May 19 2010 22:32:20 with gcc 4.4.3
configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-pthreads --enable-libfaac --enable-libfaad --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libx264 --enable-libxvid --enable-x11grab --enable-libvpx-vp8

Если ты не видишь магической фразы --enable-libvpx-vp8 тогда у тебя не та версия ffmpeg. Если готов поклясться, что собрал правильную версию, проверяй — возможно у тебя стоит две версии. Это не страшно, нужно будет только прописать полный путь к версии с поддержкой VP8.

Я собираюсь показать, как сделать двухпроходное кодирование. Первый проход просто сканирует входящий видео файл (-i pr6.dv) и выводит некоторые статистические данные в лог-файл (имя файла будет автоматически сгенерировано - pr6.dv-0.log). Указываем видео кодек параметром –vcodec:

you@localhost$ ffmpeg -pass 1 -passlogfile pr6.dv -threads 16 -token_partitions 4 -altref 1 -lag 16 -keyint_min 0 -g 250 -mb_static_threshold 0 -skip_threshold 0 -qmin 1 -qmax 51 -i pr6.dv -vcodec libvpx_vp8 -an -f rawvideo -y NUL

Команды ffmpeg не имеют ничего общего с WebM или VP8. Для их поддержки нам и нужен libvp8. Но как конкретно с этим работать на момент написания книги я еще не знаю.

Во время второго прохода ffmpeg будет читать собранную статистику при первом проходе и на основании ее кодировать видео и аудио. Результат будет записан в файл MKV, который затем мы будет преобразовывать в WebM. Когда-то ffmpeg научится кодировать сразу в WebM, но сейчас эта функция работает с багами. Вот сама команда для запуска второго прохода:

you@localhost$ ffmpeg -pass 2 -passlogfile pr6.dv -threads 16 -token_partitions 4 -altref 1 -lag 16 -keyint_min 0 -g 250 -mb_static_threshold 0 -skip_threshold 0 -qmin 1 -qmax 51 -i pr6.dv -vcodec libvpx_vp8 -b 614400 -s 320x240 -aspect 4:3 -acodec vorbis -y pr6.mkv

Тут имеется пять важных параметров:

-vcodec libvpx_vp8

указываем, что при кодировании будет использоваться кодек VP8, который всегда используется WebM.

-b 614400

Задаем битрейт. В отличии от других форматов, libvp8 хочет видеть битрейт в виде бит, а не килобит. Если нужно задать 600kbps, тогда нужно умножить 600 на 1024 и получим 614400.

-s 320x240

определяем размеры результирующего видео.

-aspect 4:3

Задаем пропорции видео. Как правило — это 4:3, но встречаются и 16:9 или 16:10. Лучше указать в параметрах явно, требуемую пропорцию, чтобы не получить какого-то сюрприза от ffmpeg.

-acodec vorbis

указываем, что для аудио используется кодек Vorbis, который всегда использует WebM.

Теперь у нас имеется файл MKV с видео VP8 и аудио Vorbis. Это уже почти то, что нам нужно. Технически формат WebM очень похож на MKV. Требуется изменить всего несколько бит, чтобы получить WebM. В этом нам поможет утилита mkclean:

you@localhost$ mkclean --doctype 4 pr6.mkv pr6.webm

Других предназначений у нее нет.

Куда дальше