- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF93:MEncoder
Материал из Linuxformat.
Содержание |
MEncoder: ужимаем видео
- Цифровой видеопоток может быть сжат различными алгоритмами или не сжат вовсе. Всё это влияет как на размеры видеофайла, так и на качество изображения. Найти золотую середину между двумя крайностями поможет Евгений Гаврилов.
Унекоторых читателей, вероятно, уже возник вопрос: «А зачем кодировать видео? Ведь это потеря качества!». Ну, во-первых, потеря качества бывает и незначительной, а при использовании фильтров возможно даже некоторое улучшение изображения, зато размер файла сокращается в разы. К тому же, стандартные сжатые AVI-файлы гораздо проще передавать через Интернет. Вы же не хотите, чтобы ваши родственники и друзья умерли в ожидании загрузки DVD- диска объемом 4,5 ГБ с записью вашего новорожденного ребенка? Тогда читайте дальше!
Форматы и кодеки
На сегодняшний день существует множество кодеков (т.е. способов сжать видеопоток), и форматов (средств упаковки сжатых данных в файл вместе с сопутствующей информацией). Вездесущая корпорация Microsoft призывает к использованию формата WMV (Windows Media Video), так как он (по ее мнению) значительно лучше некогда ею же созданного контейнера AVI *1. Многочисленные пользователи, тем не менее, пока не собираются переходить на новый формат. Мы же не будем пользоваться и AVI, а обратим свое внимание на OGM (Ogg Media, или Ogg Media File). Он позволяет без проблем хранить звук, сжатый кодеком Vorbis.
Отметим, что Ogg – это контейнер, а Vorbis – алгоритм сжатия. Говоря «Ogg Vorbis», обычно подразумевают файл-контейнер Ogg, звук в котором сжат при помощи Vorbis. Далее, для краткости, мы будем использовать «Ogg» вместо «Ogg Vorbis». Что же касается OGM, то он возник как развитие контейнера Ogg и позволяет хранить данные, сжатые видео- и звуковыми кодеками, которых на сегодняшний день существует не меньше, чем различных форматов контейнеров. Наиболее популярными являются: Xvid и DivX для видео, Vorbis и MP3 – для аудио. Все эти форматы сегодня в равной степени поддерживаются аппаратно (в бытовой технике), кроме разве что Ogg Vorbis, который покамест понимается весьма ограниченным набором «реальных» проигрывателей. Кроме того, редкий аппаратный плейер умеет работать с контейнером OGM.
Мы остановим свой выбор на Xvid и Vorbis. Причин этому несколько. Во-первых, оба кодека распространяются по лицензии GPL. Во-вторых, если Xvid и DivX еще могут посоревноваться за пальму первенства по качеству получаемого видео, то со звуком ситуация проще. Vorbis разрабатывался несколько позже MP3, что дало ему определенные преимущества: разработчики смогли учесть те моменты, которые не были приняты во внимание при создании MP3. К тому же, Vorbis использует другую психоакустическую модель, обеспечивающую более высокое качество.
Кодировщики
Для работы с видеофайлами нам понадобится MPlayer, в состав которого входит отличный кодировщик mencoder. Для него существует множество графических оболочек, но использовать их я бы не советовал: удобный интерфейс редко включает все доступные опции, а в результате вы теряете контроль над процессом.
Перед установкой самого MPlayer необходимо проинсталлировать кодеки Xvid и Vorbis – обычно они находятся в пакете essentail-codecs. Не забудьте добавить путь к ним в файл /etc/ld.so.conf и указать их каталог опцией --with-codecsdir=DIR при сборке MPlayer (если вы хотите получить стандартный графический интерфейс к MPlayer, не забудьте также ключ --enable-gui). После выполнения configure, внимательно посмотрите отчет о кодеках, поддерживаемых MPlayer в вашей системе.
Что кодировать?
Перекодирование можно осуществлять между любыми двумя форматами, при условии, что они поддерживаются MPlayer. Однако, в большинстве случаев исходным форматом является MPEG-2 (этот способ сжатия используется в DVD), а выходным – MPEG-4 (например, Xvid). Сформулируем стоящую перед нами задачу следующим образом: необходимо перекодировать DVD (видеозапись хранится в файлах video1.vob, video2.vob) в AVI. Вам все понятно? Тогда приступим к решению!
Вначале для удобства работы объединим два VOB-файла в один:
$ cat video1.vob video2.vob|mencoder - -oac copy -ovc copy -o video.vob -ffourcc MPEG-2
Мы «сливаем» video[1-2].vob простой cat и затем копируем их аудио- (-oac copy) и видеопотоки (-ovc copy) с помощью mencoder. Для того, чтобы полученный файл можно было просмотреть не только в MPlayer, рекомендуется сделать запись об используемом кодеке в заголовке файла: для этого применяется опция -ffourcc. Но поскольку наш файл video.vob является промежуточным, это не так уж важно. На данном этапе из фильма можно также «вырезать» определенные моменты, воспользовавшись опциями -ss <первый кадр> и -endpos <продолжительность или размер>. Продолжительность задается в стандартном формате [[hh:]mm:]ss[.ms], а размер – в байтах (b), килобайтах (kb) или мегабайтах (mb).
Шаг 1: Звук
Теперь, когда мы получили объемный, но единый файл, можно приступать к первой фазе – извлечению аудиодорожки и сжатию ее в Ogg. Преобразование аудиопотока из одного сжатого формата в другой напрямую невозможно, хотя некоторые программы и утверждают, что умеют делать это. На самом деле, «за кулисами» звук преобразуется в несжатый формат PCM – Pulse-coding modulation – а затем обрабатывается выходным кодеком. Мы пойдем тем же путем. Чтобы извлечь PCM-аудиопоток из файла video.vob, можно выполнить следующую команду:
$ mplayer video.vob -ao pcm:fast:file=track.wav -vo null
Фактически, мы воспроизводим полученный файл в MPlayer, однако, для вывода звука и изображения используются не совсем стандартные устройства. Звуковой драйвер указывается опцией -ao. Здесь мы выбрали PCM с сохранением в файл track.wav (вместо отправки на привычные колонки), а опция fast позволила нам сделать это «быстро» (т.е. не в режиме реального времени воспроизведения фильма). Параметр -vo null задает нуль-устройство для вывода изображения, т.е. отсекает ненужное на данном этапе видео.
Полученный звук можно закодировать с помощью утилиты Oggenc, входящей в пакет Vorbis.
#oggenc track.wav -q 3 -o track.ogg
Параметр -q 3 задает уровень качества. Номинальный битрейт составляет 112 кбит/с, средний – 88 кбит/с. Не пугайтесь низких значений – вспомните, что Vorbis использует психоакустическую модель, отличную от применяемой в MP3, поэтому «эффективный» битрейт составляет около 128 кбит/с. При всем этом Ogg занимает меньше места, так что при желании можно поднять качество и до 4.
Закодированный звук сохраняется в файле track.ogg. Прослушайте его, и если результат вас устраивает, освободите место на диске, удалив файл track.wav.
Шаг 2: Видео
Теперь приступим к обработке, а точнее – к кодированию видео c помощью mencoder. Одним из главных параметров здесь является все тот же битрейт. Если вам неважен размер конечного файла, то все определяется требуемым качеством: при битрейте 800 кбит/с картинка выглядит вполне приемлемо. Если же нужно получить файл определенных размеров, то следует воспользоваться специальным калькулятором, встроенным в различные графические оболочки. Впрочем, все вычисления можно произвести прямо в командной строке – главное знать математику на уровне 6 класса и Bash (или что там вы выбрали, прочитав наше Сравнение?) на уровне продви- нутого пользователя. Настоящие эстеты могут воспользоваться bc. В общем, формула такова:
Mb=(length_min*60*bps/8)/1024
или, в Bash-нотации:
echo «$[($length_min*60*$bps/8)/1024] Mb required»
Чтобы просто оценить результаты работы mencoder, не обязательно дожидаться окончания кодирования. Нажмите Ctrl+C и вы сможете быстро просмотреть получившийся отрывок.
Мы переводим длину фильма (в минутах) в секунды и умножаем на битрейт, деленный на 8, поскольку он измеряется в килобитах. Поделив результат на 1024, имеем количество мегабайт, которое будет занимать наш фильм. Заметьте, мы говорим только о видео. Не забывайте добавить к полученному числу размер аудиопотока.
Из данной формулы легко получить еще одну – для подсчета битрейта, обеспечивающего требуемый размер ролика:
bps=(Mb*1024)/length_min/60*8
Полезно оценить порядки этих величин. Допустим, фильм идет 90 минут и мы хотим записать его на стандартный CD-R емкостью 700 МБ. Размер звуковой дорожки – 100 МБ. Набрав в консоли:
#echo $[600*1024/90/60*8]
получаем ответ: 904 кбит/с. Теперь можно приступать к кодированию:
$ mencoder video.vob -oac copy -ovc xvid -xvidencopts bitrate=904 -o video.avi -ffourcc xvid -forceidx
Требуемый кодек (Xvid) указывается опцией -ovc (option video codec), а параметр -xvidencopts определяет его настройки. В данном случае мы выбираем битрейт 904 кбит/с. Звук покамест оставим без изменения – mencoder с трудом справляется с мультиплексированием (т.е. сведением нескольких потоков данных в один) видео и звука Vorbis в контейнер AVI.
На данном этапе можно также применить один или несколько фильтров: обрезать поля, изменить соотношение сторон, выполнить деинтерлейсинг и т.п. Полный список фильтров, поддерживаемых mencoder, выводится командой
# mencoder -vf help
а подробную информацию о каком-то фильтре дает команда
# mencoder -vf <filter>=help
Черные поля вокруг кадра лучше удалить сразу. Они неплохо сжимаются (в смысле размера файла), но все же они занимают драгоценное место на носителе – да и выглядят неопрятно. Для этих целей служит фильтр crop, который принимает в качестве параметров ширину и высоту конечной картинки. Например, в предыдущую команду можно добавить:
# mencoder ... -o video.vob -vf crop=640:400 ...
Троеточие обозначает опущенные (совпадающие) опции. Вы также можете переложить всю «черную работу» на фильтр автоокадрирования cropdetect:
# mencoder ... -o video.vob -vf cropdetect ...
Если же вы хотите отмасштабировать изображение (уменьшить или увеличить размер картинки), на помощь придет фильтр scale. Его вызов таков:
-vf scale=w:h
Здесь w и h – новые ширина и высота изображения. Имейте в виду, что фильтры передают обрабатываемое изображение «по цепочке», и порядок их следования в ней имеет значение.
Чтобы после кодирования изображение не было приплюснуто или растянуто и наши люди не получились яйцеголовыми, следует воспользоваться опцией -xvidencopts aspect=<aspect>. В качестве параметра <aspect> можно указать соотношение сторон в виде дроби (4/3) или числа с плавающей точкой. Для его автоматического определения используется параметр autoaspect, а для указания соотношения в контейнере AVI – опция mencoder --force-avi-aspect <0.2-3.0>.
Рассмотрим изученные выше фильтры и опции на примере. Допустим, размер изображения составляет 640х480, а черные «поля» имеют ширину 20 пикселей. Мы обрежем их, растянем изображение до 720 пикселей в ширину и установим соотношение сторон равным 16/9. С учетом всех этих требований, командная строка будет выглядеть следующим образом:
# mencoder video.vob -vf crop=600:480,scale=720 -oac copy -ovc xvid - xvidencopts bitrate=904:aspect=16/9 -o video.avi -ffourcc xvid -forceidx
Пользоваться -xvidencopts autoaspect после масштабирования и кадрирования бессмысленно – программа, скорее всего, ошибется.
Шаг 3: Мультиплексирование
Итак, мы имеем звуковую дорожку в отдельном файле Ogg Vorbis, а также обработанное должным образом видео в контейнере AVI. Остался последний этап – мультиплексирование. Как мы и договаривались в начале статьи, сводить звук и видео мы будем в контейнере OGM. Для этих целей мы воспользуемся пакетом ogmtools, а именно, утилитой ogmmerge, назначение которой вполне понятно из ее названия. В качестве параметров ogmmerge принимает имена входных и выходного файлов.
# ogmmerge -o final.ogm -A video.avi track.ogg
После объединения двух потоков будет получен OGM-файл, который можно без проблем воспроизводить практически в любой программе. Опция -A отбрасывает аудиопоток, сохраненный в контейнере video.avi. Теперь самое время опубликовать файл final.ogm в Сети или его записать на чистый компакт-диск и раздать друзьям. Если вам удастся заснять что-то стоящее, не забудьте поделиться ссылочкой и с нами (letters@linuxformat.ru)! LXF
Альтернатива:
FFmpeg
FFmpeg – это законченное решение для записи, преобразования и воспроизведения аудио- и видеоконтента. В его основе лежит библиотека мультимедиа-кодеков, известная как libavcodec. Большинство из входящих в нее кодеков было разработано с нуля, чтобы обеспечить лучшую производительность.
Для того, чтобы использовать какой-либо MPEG4-совместимый кодек из числа предлагаемых libavcodec совместно с mencoder, необходимо указать соответствующее семейство опцией -ovc lavc и задать параметры кодирования ключом -lavcopts:
# mencoder VTS01.VOB -o home.avi -ovc lavc -lavcopts vcodec=xvid:vbitrate=900
Здесь мы выбрали кодек Xvid и установили битрейт равным 900 кбит/сек. Остальные подробности можно найти по адресу: http://ffmpeg.mplayerhq.hu/.
x264
x264 – это свободная библиотека для кодирования видеопотоков H264/AVC. Для того, чтобы mencoder мог использовать x264, его, скорее всего, придется пересобрать. Конечно, предварительно нужно установить сам x264. Контейнеры AVI и OGG/OGM не могут вмещать в себя потоки H264/AVC, поэтому для них лучше использовать mp4 (Mpeg4) либо mkv (Matroska).
Для мультиплексирования выходного файла можно воспользоваться услугами библиотеки libavformat (-of lavf), определяющей формат файла по расширению, или же задать его вручную опцией format:
# mencoder VTS01.vob -o home.mp4 -of lavf -ovc x264
В мире IT всегда приходится выбирать между памятью (качеством) и временем выполнения. Кодек x264 обеспечивает качественное изображение и высокую степень сжатия, но работает очень медленно. Имейте это в виду, если только у вас не современный двухядерный процессор.