Кодирование видео WebM с ffmpeg
Дата публикации: 22.03.2011
Я пишу эту главу 20 мая 2010 года. Формат WebM был представлен буквально вчера. Поэтому пока еще нет большого выбора кодеров, да и мануалов по процессу кодирования тоже. Все это не понадобится, когда WebM получит глобальную поддержку, а пока нам нужны такие инструменты:
- libvp8, и специальная версия ffmpeg с дополнительными патчами (для связки с libvp8), которые пока не входят в состав ffmpeg по умолчанию:
- последняя версия mkclean.
Итак, начнем. Из командной строки запускаем 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 320×240
-
определяем размеры результирующего видео.
- -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
Других предназначений у нее нет.
Куда дальше
- следующая — И, наконец-то, разметка
- предыдущая — Пакетное кодирование видео H.264 с HandBrake
- содержание