Отправляет email-рассылки с помощью сервиса Sendsay

KirovLUG: пользователи Linux в Вятке

Чтиво: офис и дом, часть 005

Кодирование видео с помощью mencoder.

Утилита mencoder, входящая в пакет mplayer, является мощным инструментом
для обработки видео. Оптимизированная под конкретную платформу при
перекомпиляции, она показывает не плохую производительность. Не имея
графического интерфейса (хотя можно поискать frontend'ы в Инете), она
имеет громаднейший объем опций кодирования, в которых начинающему очень
сложно с ориентироваться.

Я не буду растекаться мыслю по дереву, а сразу начну с примера.

$ mencoder dvd://1 -dvd-device ~/dvd -chapter 2-23 \
-ovc frameno -srate 44100 \
-oac mp3lame -lameopts abr:br=128:mode=1:vol=5 -o frameno.avi
$ mencoder dvd://1 -dvd-device ~/dvd -chapter 2-23 \
-vf crop=704:416 \
-ovc lavc -lavcopts vcodec=mpeg4:vpass=1:vbitrate=780:mbd=2:\
vqmin=1:vqmax=5:trell:cbp:mv0:mpeg_quant:vqcomp=0.8:vqblur=0.25:\
vlelim=-4:vcelim=7:lumi_mask=0.02:dark_mask=0.06:gray \
-oac copy -o /dev/null
$ mencoder dvd://1 -dvd-device ~/dvd -chapter 2-23 \
-vf crop=704:416 \
-ovc lavc -lavcopts vcodec=mpeg4:vpass=2:vbitrate=780:mbd=2:\
vqmin=1:vqmax=5:trell:cbp:mv0:mpeg_quant:vqcomp=0.8:vqblur=0.25:\
vlelim=-4:vcelim=7:lumi_mask=0.02:dark_mask=0.06:gray \
-oac copy -o ~/list_02.avi

Это реальный пример. "Список Шиндлера". Трехпроходное перекодирование
(vpass) с DVD в MPEG4 (vcodec=mpeg4) в качестве видеокодека и MP3 (-oac
mp3lame в первом проходе) в качестве аудиокодека. С наилучшими (на мой
взгляд), но медленными параметрами конверта. Черно-белое изображение
(gray). Обрезание "черных полос" сверху и снизу (-vf crop=704:416).
Кодируется не целый диск, только первый слой из двух (dvd://1) и то не
целиком, а только со 2-ой по 23-ую "главы" (-chapter 2-23).

Еще один реальный пример - продолжение первого:

$ mencoder dvd://2 -dvd-device ~/dvd -chapter 13-13 \
-ovc frameno -srate 44100 \
-oac mp3lame -lameopts abr:br=128:mode=1:vol=5 -o frameno.avi
$ mencoder dvd://2 -dvd-device ~/dvd -chapter 13-13 \
-vf crop=704:416 \
-ovc lavc -lavcopts vcodec=mpeg4:vpass=1:vbitrate=2500:mbd=2:\
vqmin=1:vqmax=2:trell:mv0:mpeg_quant:vqcomp=0.8:vqblur=0.25:\
vlelim=-4:vcelim=7:lumi_mask=0.02:dark_mask=0.06 \
-oac copy -o /dev/null
$ mencoder dvd://2 -dvd-device ~/dvd -chapter 13-13 \
-vf crop=704:416 \
-ovc lavc -lavcopts vcodec=mpeg4:vpass=2:vbitrate=2500:mbd=2:\
vqmin=1:vqmax=2:trell:mv0:mpeg_quant:vqcomp=0.8:vqblur=0.25:\
vlelim=-4:vcelim=7:lumi_mask=0.02:dark_mask=0.06 \
-oac copy -o ~/list_04.avi

Тот же "Список Шиндлера". Трехпроходное перекодирование с DVD в MPEG4 в
качестве видеокодека и MP3 в качестве аудиокодека. Здесь уже цветное
изображение (отсутствие gray). Обрезание "черных полос" сверху и снизу.
Здесь кодируется одна 13-ая "глава" из второго слоя (dvd://2).

Теперь немного теории. Нецелесообразно пересказывать своими словами, то
что прочитал на ресурсах, посвященных mplayer и mencoder, поэтому буду
просто приводить цитаты:

Итак, ресурсы. Обязательны для прочтения:
http://aquatique.rusunix.org/mencoding.html
http://live.pspu.ru/tiki-print_article.php?articleId=2
http://linux.net.ru/node/view/227
man mencoder
Рекомендую посмотреть:
http://linuxportal.ru/forums/index.php/t/12321/

Цитата - немного теории:
-- first quoting Макроблок
Так называется сегмент изображения 16x16 пикселей, включающий себя 4
блока яркости размером 8x8 пикселей и 2 блока насыщенности размером 8x8
пикселей.

Quantizer
Quantizer - некоторое значение качественности макроблока, полученного с
указанными настройками. Разбивая картинку на макроблоки кодек различные
части изображения кодирует по разному, исходя из тех или иных условий и
параметров.
Сейчас, цитаты, поясняющие для чего нужно кодирование в несколько
проходов:
-- first quoting В пределах кадра значения quantizer'а для разных макроблоков могут иметь
различные значения. Это порой позволяет существенно сократить размер
получаемого файла и/или сконцентрировать внимание кодека на те участки,
которым требуется более качественное изображение и использовать
макроблоки с худшим качеством на участках с малой детализацией или
подвижностью, той или иной степени освещенности.
-- second quoting Для более точных расчетов значений quantizer'а как правило используется
2 прохода кодирования. Во время первого прохода необходимая кодеку
информация по каждому кадру собирается в файл. Во время второго прохода
кодек использует собранную информацию для более точных расчетов.
-- third quoting Кодирование в 2 прохода: название происходит оттого, что при этом методе
файл кодируется дважды. При первом кодировании (предварительный проход)
создается несколько временных файлов (*.log) с размером в несколько
мегабайт, не стоит удалять их пока (вы можете удалить AVI). При втором
проходе конечный файл двойного прохода создается с использованием данных
битрейта временных файлов. В результате качество картинки в конечном
файле будет намного лучшим.
-- fourth quoting Кодирование в 3 прохода: это расширенный вариант кодирования в 2
прохода, при котором кодирование звука происходит отдельно. Этот метод
позволяет оценить битрейт удобный для записи видео на CD. В отличии от
кодирования в 2 прохода звук кодируется только один раз.
Несколько слов скажу о наиболее часто используемых сервисных функциях.

1. Использование в качестве DVD-материала файлы скопированные на жесткий
диск.

-dvd-device <path to device>
Переопределяет DVD-устройство по умолчанию

2. Кодирование только фрагмента фильма. Например, для разбивки на
несколько носителей или для оценки качества кодирования.

-sb <byte position> или -ss <time>
Начать с данной "временной" или "байтной" позиции.
-ss 56
Пропустить 56 секунд
-ss 01:10:00
Пропустить 1 час 10 минут

-endpos <[[hh:]mm:]ss[.ms]|size[b|kb|mb]>
Остановить кодирование на данной "временной" или "байтной" позиции.
Байтная позиция не будет точной, так как кодирование может
прекратиться только на границе фреймов.
-endpos 56
кодировать только 56 секунд
-endpos 01:10:00
кодировать только 1 час и 10 минут
-endpos 100mb
кодировать только 100 мегабайт

для DVD фильмов также можно использовать фрагментирование, предложенное
создателями этого DVD:

-chapter <chapter id>[-<end chapter id>]
Определяет с какой по какую "главы" DVD обрабатывать
dvd://1 и dvd://2
Определяет какой слой обрабатывать

3. Использование видеофильтров. Они позволяют модифицировать видеопоток
и его свойства.

-vf <filter1[=options],filter2,...>
Установка цепочки видеофильтров
-vop <...,filter3[=options],filter2,filter1>
Установка цепочки видеофильтров, применяемых в обратном порядке. Как
противоположность -vf.

a) Обрезание краев (черных полос) изображения
Цитаты:
-- first quoting Настоятельно рекомендую обрезать пустоту вокруг. Это связано с тем, что
макроблоки по этим краям будут требовать для себя больший видеопоток,
что естественно пойдет в ущерб качеству или размеру. В наборе
видеофильтров есть прекрасный фильтр cropdetect, который "подскажет",
какие параметры нужно передать фильтру crop. Однако не стоит забывать,
что каждый макроблок имеет размер 16x16 пикселей, то есть ширина и
высота обрезанного видео должны быть кратны 16. Лучше немного заехать на
изображение, чем оставить черную полосу в 2-3 пиксела.
-- second quoting crop обрезает черные полосы по краям, если они конечно, есть и в этом
есть необходимость. Во-вторых, в широкополосных фильмах ты спокойно
можешь обрезать ненужные 40-80 точек с обоих концов, которые, как
правило, не вызовут "обрезания" смысла фильма. Да и кодеку это будет на
пользу - меньше информации придется вместить и в без того скудный
vbitrate.
-vf crop или -vop crop
crop[=w:h:x:y]
Выстригает заданную часть от изображения и отбрасывает остальное.
w,h Ширина и высота выстригаемого изображения
x,y Позиция выстригаемого изображения, по умолчанию - центр.

b) Масштабирование, изменение размера изображения. Например, для
уменьшения размера результирующего файла или для изменения пропорций
изображения

-vf scale или -vop scale
scale[=w:h[:c[:p]]]
Программно (медленно) масштабирует изображение и выполняет YUV<->RGB
цветовое преобразование (см. также -sws опцию)
w,h новая ширина/высота после масштабирования.
c chroma skipping
0: use all available input lines for chroma
1: use only every 2. input line for chroma
2: use only every 4. input line for chroma
3: use only every 8. input line for chroma
p параметр масштабирования (зависит от использования метода
масштабирования)
-sws 2 (bicubic): резкость (0 (soft) - 100 (sharp))
-sws 7 (gaussian): резкость (0 (soft) - 100 (sharp))
-sws 9 (lanczos): длина фильтра (1-10)
-sws <software scaler type>
Эта опция устанавливает качество (соответственно и скорость)
программного масштабирования.
0 fast bilinear (default)
1 bilinear
2 bicubic (хорошее качество)
3 experimental
4 nearest neighbour (плохое качество)
5 area
6 luma bicubic / chroma bilinear
7 gauss
8 sincR
9 lanczos
10 bicubic spline

Каков же примерный алгоритм перекодирования видео? Для примера возьмем
перекодирование в MPEG1 :)

Первое: проверяем - в текущем каталоге не должно быть файлика
frameno.avi, иначе

$ fm -f frameno.avi

Второе: кодируем аудиопоток

$ mencoder night_2.avi -ovc frameno -srate 44100 \
-oac mp3lame -lameopts abr:br=128:mode=1:vol=10 -o frameno.avi

"-srate 44100" - изменяем частоту дискретизации
"abr:br=128" - метод "average bitrate" c битрейтом 128Kbit
"mode=1" - join-stereo
"vol=10" - увеличиваем уровень звука
после завершения работы на экран выведется список рекомендованных
битрейтов для видеопотока:

Recommended video bitrate for 650MB CD: 1288
Recommended video bitrate for 700MB CD: 1398
Recommended video bitrate for 800MB CD: 1616
Recommended video bitrate for 2 x 650MB CD: 2709
Recommended video bitrate for 2 x 700MB CD: 2928
Recommended video bitrate for 2 x 800MB CD: 3365

Т.е. нужно указать битрейт в 1288Kbit, что бы итоговый файл влезал на
650Mb-ую болванку, или указать 2928Kbit для двух итоговых 700Mb-х
болванок.

Третье: примеримся с качеством. Для этого перекодируем только первые
двадцать секунд фильма:

$ mencoder night_2.avi -endpos 00:20 -ovc lavc -lavcopts \
vcodec=mpeg1video:vpass=1:vbitrate=700 -oac copy -o /dev/null
$ mencoder night_2.avi -endpos 00:20 -ovc lavc -lavcopts \
vcodec=mpeg1video:vpass=2:vbitrate=700 -oac copy -o test.avi

Посмотрим, что получилось:

$ mplayer test.avi

Если все устраивает, то переходим к следующему шагу, если нет, то
играемся с опциями кодирования, фильтрами и т.п., повторяя третий пункт
до "просветления"

Четвертое: получение итогового видео. Убираем ограничение "-endpos" и
запускаем оба прохода

$ mencoder night_2.avi -ovc lavc -lavcopts vcodec=mpeg1video:\
vpass=1:vbitrate=300 -oac copy -o /dev/null
$ mencoder night_2.avi -ovc lavc -lavcopts vcodec=mpeg1video:\
vpass=2:vbitrate=300 -oac copy -o night_2_mpeg.avi

Все. Теперь темными зимними вечерами можно порадовать себя любимым
фильмом.

Напоследок, еще один пример - скрипт с помощью которого я кодировал
"Ночной Дозор" (однослойный DVD). MPEG4 в качестве видеокодека и с
сохранением AC3 аудиокодека (-oac copy в первом проходе). Чтобы не
терять качество ставилась задача использовать высокий битрейт
(vbitrate=1900 и vbitrate=2150), для этого пришлось разбить фильм на три
CD-диска. Для сохранения пропорций 16:9 использовалась опция autoaspect.

begin dvdcode.sh #!/bin/sh

cd /mnt/hda8/CD_Disks

echo "1 disc - frameno" > night.log
nice -+19 mencoder dvd://1 -dvd-device /dev/cdrom -chapter 1-11 \
-ovc frameno -oac copy -o frameno.avi
echo "1 disc - pass 1" >> night.log
nice -+19 mencoder dvd://1 -dvd-device /dev/cdrom -chapter 1-11 \
-ovc lavc -lavcopts vcodec=mpeg4:vpass=1:vbitrate=1900:\
mbd=2:vqmin=1:vqmax=5:autoaspect:trell:cbp:mv0:mpeg_quant:\
vqcomp=0.8:vqblur=0.25:vlelim=-4:vcelim=7:\
lumi_mask=0.02:dark_mask=0.06 -oac copy -o /dev/null
echo "1 disc - pass 2" >> night.log
nice -+19 mencoder dvd://1 -dvd-device /dev/cdrom -chapter 1-11 \
-ovc lavc -lavcopts vcodec=mpeg4:vpass=2:vbitrate=1900:\
mbd=2:vqmin=1:vqmax=5:autoaspect:trell:cbp:mv0:mpeg_quant:\
vqcomp=0.8:vqblur=0.25:vlelim=-4:vcelim=7:\
lumi_mask=0.02:dark_mask=0.06 -oac copy -o ~/cd_01.avi
echo "1 disc - move and remove" >> night.log
rm frameno.avi

echo "2 disc - frameno" >> night.log
nice -+19 mencoder dvd://1 -dvd-device /dev/cdrom -chapter 12-23 \
-ovc frameno -oac copy -o frameno.avi
echo "2 disc - pass 1" >> night.log
nice -+19 mencoder dvd://1 -dvd-device /dev/cdrom -chapter 12-23 \
-ovc lavc -lavcopts vcodec=mpeg4:vpass=1:vbitrate=1900:\
mbd=2:vqmin=1:vqmax=5:autoaspect:trell:cbp:mv0:mpeg_quant:\
vqcomp=0.8:vqblur=0.25:vlelim=-4:vcelim=7:\
lumi_mask=0.02:dark_mask=0.06 -oac copy -o /dev/null
echo "2 disc - pass 2" >> night.log
nice -+19 mencoder dvd://1 -dvd-device /dev/cdrom -chapter 12-23 \
-ovc lavc -lavcopts vcodec=mpeg4:vpass=2:vbitrate=1900:\
mbd=2:vqmin=1:vqmax=5:autoaspect:trell:cbp:mv0:mpeg_quant:\
vqcomp=0.8:vqblur=0.25:vlelim=-4:vcelim=7:\
lumi_mask=0.02:dark_mask=0.06 -oac copy -o ~/cd_02.avi
echo "2 disc - move and remove" >> night.log
rm frameno.avi

echo "3 disc - frameno" >> night.log
nice -+19 mencoder dvd://1 -dvd-device /dev/cdrom -chapter 24-32 \
-ovc frameno -oac copy -o frameno.avi
echo "3 disc - pass 1" >> night.log
nice -+19 mencoder dvd://1 -dvd-device /dev/cdrom -chapter 24-32 \
-ovc lavc -lavcopts vcodec=mpeg4:vpass=1:vbitrate=2150:\
mbd=2:vqmin=1:vqmax=5:autoaspect:trell:cbp:mv0:mpeg_quant:\
vqcomp=0.8:vqblur=0.25:vlelim=-4:vcelim=7:\
lumi_mask=0.02:dark_mask=0.06 -oac copy -o /dev/null
echo "3 disc - pass 2" >> night.log
nice -+19 mencoder dvd://1 -dvd-device /dev/cdrom -chapter 24-32 \
-ovc lavc -lavcopts vcodec=mpeg4:vpass=2:vbitrate=2150:\
mbd=2:vqmin=1:vqmax=5:autoaspect:trell:cbp:mv0:mpeg_quant:\
vqcomp=0.8:vqblur=0.25:vlelim=-4:vcelim=7:\
lumi_mask=0.02:dark_mask=0.06 -oac copy -o ~/cd_03.avi
echo "3 disc - move and remove" >> night.log
rm frameno.avi
end dvdcode.sh --
C уважением, Kolotov Alexandr aka mr. Эбола
отвечать: akmypo***@m*****.ru
ICQ: 100349254

| Registered Linux user # 236664 |
-*Информационный канал Subscribe.Ru
Подписан адрес:
Код этой рассылки: comp.soft.linux.kirovlug
Написать в лист: mailto:comp.soft.linux.kirovlug-list@subscribe.ru
Отписать: mailto:comp.soft.linux.kirovlug--unsub@subscribe.ru

http://subscribe.ru/ http://subscribe.ru/feedback

Ответить   Thu, 9 Sep 2004 16:23:47 +0400 (#226528)