7.3. Кодирование семейством кодеков libavcodec

libavcodec предоставляет возможность простого кодирования в множество интересных видео и аудио форматов. Вы можете кодировать следующими кодеками (более или менее свежий список):

7.3.1. Видео кодеки libavcodec

Название видео кодекаОписание
mjpegMotion JPEG
ljpegJPEG без потери качества
jpeglsJPEG LS
targaTarga рисунок
gifGIF рисунок
bmpBMP рисунок
pngPNG рисунок
h261H.261
h263H.263
h263pH.263+
mpeg4ISO стандарт MPEG-4 (DivX, Xvid совместимый)
msmpeg4вариант пре-стандарта MPEG-4 от MS, v3 (он же DivX3)
msmpeg4v2вариант пре-стандарта MPEG-4 от MS, v2 (используемый в старых ASF файлах)
wmv1Windows Media Video, версия 1 (он же WMV7)
wmv2Windows Media Video, версия 2 (он же WMV8)
rv10RealVideo 1.0
rv20RealVideo 2.0
mpeg1videoMPEG-1 видео
mpeg2videoMPEG-2 видео
huffyuvсжатие без потерь
ffvhuffhuffyuv без потерь, модифицированный FFmpeg
asv1ASUS Видео v1
asv2ASUS Видео v2
ffv1видео кодек без потерь из FFmpeg
svq1Sorenson видео 1
flvSorenson H.263 используемый в Flash Видео
flashsvFlash Screen Video
dvvideoSony Digital Video
snowэкспериментальный кодек FFmpeg, основанный на вейвлетах
zmbvZip Motion Blocks Video
dnxhdAVID DNxHD

Первый столбец содержит названия кодеков, которые следует указывать после vcodec опции, например: -lavcopts vcodec=msmpeg4

Пример с MJPEG сжатием:

mencoder dvd://2 -o title2.avi -ovc lavc -lavcopts vcodec=mjpeg -oac copy

7.3.2. Аудио кодеки libavcodec

Название аудио кодекаОписание
ac3Dolby Digital (AC-3)
adpcm_*Форматы Adaptive PCM, смотрите дополнительную таблицу
flacFree Lossless Audio Codec (FLAC)
g726G.726 ADPCM
libamr_nb3GPP Adaptive Multi-Rate (AMR) узкополосный
libamr_wb3GPP Adaptive Multi-Rate (AMR) широкополосный
libfaacAdvanced Audio Coding (AAC) - используя FAAC
libgsmETSI GSM 06.10 full rate
libgsm_msMicrosoft GSM
libmp3lameMPEG-1 audio layer 3 (MP3) - используя LAME
mp2MPEG-1 audio layer 2 (MP2)
pcm_*PCM форматы, смотрите дополнительную таблицу
roq_dpcmId Software RoQ DPCM
sonicэкспериментальный кодек от FFmpeg с потерями (lossy)
soniclsэкспериментальный кодек от FFmpeg без потерь (lossless)
vorbisVorbis
wmav1Windows Media Audio v1
wmav2Windows Media Audio v2

Первый столбец содержит названия кодеков, которые следует указывать после acodec опции, например: -lavcopts acodec=ac3

Пример с AC-3 сжатием:

mencoder dvd://2 -o title2.avi -oac lavc -lavcopts acodec=ac3 -ovc copy

В отличие от видео кодеков libavcodec, ее аудио кодеки не очень разумно используют отданные им биты, в силу неудачной реализации некоторой минимальной психоакустической модели (если она вообще есть), которая является характерной чертой большинства остальных реализаций кодеков. Однако заметьте, что все эти аудио кодеки очень быстры и работают прямо из коробки везде, где MEncoder скомпилирован с libavcodec (а почти всегда так оно и есть), и не зависят от внешних библиотек.

7.3.2.1. Дополнительная таблица PCM/ADPCM форматов

Название PCM/ADPCM кодекаОписание
pcm_s32lesigned 32-bit little-endian
pcm_s32besigned 32-bit big-endian
pcm_u32leunsigned 32-bit little-endian
pcm_u32beunsigned 32-bit big-endian
pcm_s24lesigned 24-bit little-endian
pcm_s24besigned 24-bit big-endian
pcm_u24leunsigned 24-bit little-endian
pcm_u24beunsigned 24-bit big-endian
pcm_s16lesigned 16-bit little-endian
pcm_s16besigned 16-bit big-endian
pcm_u16leunsigned 16-bit little-endian
pcm_u16beunsigned 16-bit big-endian
pcm_s8signed 8-bit
pcm_u8unsigned 8-bit
pcm_alawG.711 A-LAW
pcm_mulawG.711 μ-LAW
pcm_s24daudsigned 24-bit D-Cinema Audio формат
pcm_zorkActivision Zork Nemesis
adpcm_ima_qtApple QuickTime
adpcm_ima_wavMicrosoft/IBM WAVE
adpcm_ima_dk3Duck DK3
adpcm_ima_dk4Duck DK4
adpcm_ima_wsWestwood Studios
adpcm_ima_smjpegSDL Motion JPEG
adpcm_msMicrosoft
adpcm_4xm4X Technologies
adpcm_xaPhillips Yellow Book CD-ROM eXtended Architecture
adpcm_eaElectronic Arts
adpcm_ctCreative 16->4-bit
adpcm_swfAdobe Shockwave Flash
adpcm_yamahaYamaha
adpcm_sbpro_4Creative VOC SoundBlaster Pro 8->4-bit
adpcm_sbpro_3Creative VOC SoundBlaster Pro 8->2.6-bit
adpcm_sbpro_2Creative VOC SoundBlaster Pro 8->2-bit
adpcm_thpNintendo GameCube FMV THP
adpcm_adxSega/CRI ADX

7.3.3. Опции кодирования libavcodec

В идеале, Вы, наверное, хотели бы иметь возможность просто сказать кодировщику переключиться на "высокое качество" и начать кодирование. Это было бы замечательно, но, к сожалению, трудно реализуемо, поскольку различные опции кодирования, в зависимости от исходного материала, дают в результате различное качество. Так происходит потому, что сжатие зависит от визуальных свойств видео. Например, аниме и живая съемка имеют сильно отличающиеся свойства и, поэтому, требуют разные опции для получения оптимального результата. Хорошая новость состоит в том, что некоторые опции, такие как mbd=2, trell и v4mv, никогда не следует опускать. Детальное описание основных опций кодирования смотрите ниже.

Опции для настройки:

  • vmax_b_frames: хороши 1 или 2, в зависимости от фильма. Заметьте, если хотите, чтобы Ваш фильм декодировался DivX5, Вы должны активировать поддержку закрытых GOP, используя опцию cgop libavcodec, но также должны деактивировать определение сцен, что не является хорошей идеей, поскольку несколько вредит эффективности.

  • vb_strategy=1: помогает в высокодинамичных сценах. Для некоторых видео файлов vmax_b_frames может повредить качеству, но vmax_b_frames=2 вместе с vb_strategy=1 поможет в этом случае.

  • dia: диапазон поиска движения. Большие значения лучше и медленнее. Отрицательные значения — это совершенно другая шкала. Хорошими значениями являются -1 для быстрого кодирования или 2-4 — для медленного.

  • predia: предпроход поиска движения. Не так важен, как dia. Хорошими являются значения от 1 (по умолчанию) до 4. Требует preme=2, чтобы быть действительно полезным.

  • cmp, subcmp, precmp: Функция сравнения для поиска движения. Поэкспериментируйте со значениями 0 (по умолчанию), 2 (hadamard), 3 (dct), и 6 (соотношение сигнал-шум). 0 — самый быстрый и достаточен для precmp. В случае cmp и subcmp, 2 является хорошим для аниме, а 3 для живой съемки. 6 может оказаться лучше, а может и нет, но он медленнее.

  • last_pred: Количество предсказателей движения, берущихся из предыдущего кадра. 1-3 или около того помогут Вам ценой небольшой потери в скорости. Большие значения медленны и не дают дополнительного улучшения.

  • cbp, mv0: Контролирует выбор макроблоков. Незначительное снижение скорости с небольшим приростом в качестве.

  • qprd: адаптивное квантование, основанное на сложности макроблока. Может сделать лучше или хуже в зависимости от видео и других опций. Она также может привести к появлению артефактов, если Вы не установите vqmax в некоторое разумно малое значение (хорошо — 6, может быть даже 4); vqmin=1 также может помочь.

  • qns: очень медленно, особенно в комбинации с qprd. Эта опция укажет кодировщику минимизировать шум от артефактов сжатия вместо создания закодированного видео, полностью соответствующего исходному. Не используйте ее, если только не перепробовали настроить все, что было возможно, а результат все таки недостаточно хорош.

  • vqcomp: Настраивает управление битпотоком. Какие значения являются хорошими, зависит от фильма. Если хотите, можете без опаски оставить значение по умолчанию. Уменьшение vqcomp отдает больше бит в сцены с низкой сложностью, увеличение его передает биты в очень сложные сцены (по умолчанию: 0.5, диапазон: 0-1. рекомендуемый диапазон: 0.5-0.7).

  • vlelim, vcelim: Устанавливает порог отбрасывания одиночного коэффициента для яркостной и цветностной плоскостей. Они кодируются независимо во всех MPEG-похожих алгоритмах. Идея этих опций заключается в использованию некоторой хорошей эвристики для определения момента, когда изменения в блоке ниже указанного Вами порога, и что его стоит кодировать как "блок без изменений". Это сохраняет биты и, возможно, ускоряет кодирование. vlelim=-4 и vcelim=9 выглядят неплохими для живой съемки, но, скорее всего, не помогут для аниме; при кодировании анимации Вам, возможно, следует оставить эту опцию неизменной.

  • qpel: Четверьтпиксельная оценка движения. По-умолчанию, MPEG-4 использует полупиксельную точность для поиска движения, следовательно, эта опция вносит дополнительные накладные расходы, поскольку сохраняет больше информации в закодированном файле. Улучшение/ухудшение степени сжатия зависит от фильма, но обычно эта опция не очень эффективна для аниме. qpel всегда вносит значительный вклад в CPU время декодирования (+25% на практике).

  • psnr: не влияет на сам процесс кодирования, но выводит в файл тип/размер/качество каждого кадра, а также итоговый PSNR (Peak Signal to Noise Ratio, пиковое отношения сигнала к шуму) в конце процесса.

Опции, с которыми играть не стоит:

  • vme: Значение по умолчанию является лучшим.

  • lumi_mask, dark_mask: Психовизуальное адаптивное квантование. Не стоит играть с этими опциями, если заботитесь о качестве. Разумные значения могут быть эффективными в Вашем случае, но имейте в виду, что это весьма субъективно.

  • scplx_mask: Пытается предотвратить появление квадратиков, но лучше выполнить постобработку.

7.3.4. Примеры настроек кодирования

Следующие настройки — это примеры различных комбинаций опций кодирования, которые влияют на соотношение скорость-качество при той же величине целевого биптотока.

Все настройки кодирования проверялись на тестовом видео 720x448 @30000/1001 fps с целевым битпотоком 900кбит/сек, на машине AMD-64 3400+ с 2400 МГц и 64 битном режиме. Для каждой настройки кодирования указаны измеренная скорость кодирования (в кадрах в секунду) и потеря PSNR (в дБ) по сравнению с настройкой "очень высокое качество". Поймите, пожалуйста, что в зависимости от Вашего материала, типа машины, прогресса разработки Вы можете получить сильно отличающиеся результаты.

ОписаниеОпции кодированияскорость (в fps)Относительная потеря PSNR (в дБ)
Очень высокое качествоvcodec=mpeg4:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:predia=2:dia=2:vmax_b_frames=2:vb_strategy=1:precmp=2:cmp=2:subcmp=2:preme=2:qns=26fps0дБ
Высокое качествоvcodec=mpeg4:mbd=2:trell:v4mv:last_pred=2:dia=-1:vmax_b_frames=2:vb_strategy=1:cmp=3:subcmp=3:precmp=0:vqcomp=0.6:turbo15fps-0.5дБ
Быстроеvcodec=mpeg4:mbd=2:trell:v4mv:turbo42fps-0.74дБ
Реального времениvcodec=mpeg4:mbd=2:turbo54fps-1.21дБ

7.3.5. Нестандартные inter/intra матрицы

С этой возможностью libavcodec, Вы можете установить нестандартные inter (I-кадры/ключевые) и intra (P-кадры/предсказанные) матрицы. Это поддерживается многими кодеками: В mpeg1video и mpeg2video также заявлена поддержка.

Обычное использовании этой опции — установить матрицы, предпочитаемые спецификациями KVCD.

KVCD Матрица Квантования "Notch":

Intra:

 8  9 12 22 26 27 29 34
 9 10 14 26 27 29 34 37
12 14 18 27 29 34 37 38
22 26 27 31 36 37 38 40
26 27 29 36 39 38 40 48
27 29 34 37 38 40 48 58
29 34 37 38 40 48 58 69
34 37 38 40 48 58 69 79

Inter:

16 18 20 22 24 26 28 30
18 20 22 24 26 28 30 32
20 22 24 26 28 30 32 34
22 24 26 30 32 32 34 36
24 26 28 32 34 34 36 38
26 28 30 32 34 36 38 40
28 30 32 34 36 38 42 42
30 32 34 36 38 40 42 44

Использование:

mencoder input.avi -o output.avi -oac copy -ovc lavc \
    -lavcopts inter_matrix=...:intra_matrix=...

mencoder input.avi -ovc lavc -lavcopts \
vcodec=mpeg2video:intra_matrix=8,9,12,22,26,27,29,34,9,10,14,26,27,29,34,37,\
12,14,18,27,29,34,37,38,22,26,27,31,36,37,38,40,26,27,29,36,39,38,40,48,27,\
29,34,37,38,40,48,58,29,34,37,38,40,48,58,69,34,37,38,40,48,58,69,79\
:inter_matrix=16,18,20,22,24,26,28,30,18,20,22,24,26,28,30,32,20,22,24,26,\
28,30,32,34,22,24,26,30,32,32,34,36,24,26,28,32,34,34,36,38,26,28,30,32,34,\
36,38,40,28,30,32,34,36,38,42,42,30,32,34,36,38,40,42,44 -oac copy -o svcd.mpg

7.3.6. Пример

Итак, Вы только что купили новенькую, блестящую копию фильма "Гарри Поттер и Тайная Комната" (в широкоэкранном формате, конечно) и хотите сделать рип этого DVD так, чтобы добавить его к Домашнему кинотеатру на PC. Это DVD первого региона, поэтому NTSC. Пример ниже также применим и для PAL, за исключением того, что надо будет опустить -ofps 24000/1001 (поскольку частота кадров на выходе такая же, как и на входе), и, конечно, границы обрезания будут другими.

После запуска mplayer dvd://1 мы следуем процессу, детально описанному в разделе Как работать с телесином и чересстрочностью в NTSC DVD, и выясняем, что это 24000/1001 fps построчное видео, а значит, использовать фильтры обратного телесина, такие как pullup или filmdint не нужно.

Далее, мы хотим определить верные границы обрезания, поэтому используем фильтр cropdetect:

mplayer dvd://1 -vf cropdetect

Убедитесь, что переместились к полностью заполненному кадру (например, к светлой сцене после пропущенных начальных титров и логотипов), Вы должны увидеть в консоли MPlayer:

crop area: X: 0..719  Y: 57..419  (-vf crop=720:362:0:58)

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

mplayer dvd://1 -vf crop=720:362:0:58

И убеждаемся, что все выглядит прекрасно. Далее, проверяем, что ширина и высота делятся на 16. С шириной все в порядке, а с высотой — нет. Поскольку мы не заваливали математику в 7-ом классе, то знаем, что ближайшее целое, меньшее 362 и кратное 16, равно 352.

Мы могли бы просто использовать crop=720:352:0:58, но будет лучше отрезать понемногу от верха и низа, чтобы центр остался на месте. Мы уменьшили высоту на 10 пикселов, но не хотим увеличивать смещение по y на 5, поскольку это нечетное число и отрицательно скажется на качестве. Вместо этого, мы увеличим y на 4:

mplayer dvd://1 -vf crop=720:352:0:62

Другая причина, по которой мы урезаем пикселы сверху и снизу, заключаемся в том, что мы хотим убедиться, что удалены все наполовину черные пикселы, если они есть. Если Ваше видео подвержено телесину, убедитесь, что фильтр pullup (или любой другой фильтр обратного телесина, который Вы решили использовать) находится в цепочке до фильтра crop. Если оно чересстрочное, то перед обрезкой проведите деинтерлейсинг. (Если решили сохранить чересстрочность видео, убедитесь, что вертикальный сдвиг обрезания кратен 4.)

Если Вас действительно заботит потеря этих 10 пикселов, Вы можете вместо этого отмасштабировать фильм, уменьшив размерности до ближайших кратных 16 значений. Цепочка фильтров будет выглядеть примерно так:

-vf crop=720:362:0:58,scale=720:352

Подобное уменьшение изображения будет означать потерю небольшого количества деталей, хотя это, возможно, окажется незаметным. Масштабирование изображения в сторону увеличения даст худшее качество (если Вы не увеличиваете битпоток). Обрезка же полностью выбросит те пикселы. Это компромисс, идти на который или нет, придется решать в каждом частном случае. Например, если DVD видео было создано для телевидения, Вы можете захотеть избежать вертикального масштабирования, поскольку дискретизация строк соответствует тому, как содержимое изначально записывалось.

При проверке видим, что наш фильм имеет немного движения и большое количество деталей, так что выбираем для битпотока значение 2400Кбит/сек.

Теперь мы готовы произвести двухпроходное кодирование. Проход первый:

mencoder dvd://1 -ofps 24000/1001 -oac copy -o Harry_Potter_2.avi -ovc lavc \
    -lavcopts vcodec=mpeg4:vbitrate=2400:v4mv:mbd=2:trell:cmp=3:subcmp=3:autoaspect:vpass=1 \
    -vf pullup,softskip,crop=720:352:0:62,hqdn3d=2:1:2

И второй проход с теми же параметрами, за исключением vpass=2:

mencoder dvd://1 -ofps 24000/1001 -oac copy -o Harry_Potter_2.avi -ovc lavc \
    -lavcopts vcodec=mpeg4:vbitrate=2400:v4mv:mbd=2:trell:cmp=3:subcmp=3:autoaspect:vpass=2 \
    -vf pullup,softskip,crop=720:352:0:62,hqdn3d=2:1:2

Опции v4mv:mbd=2:trell значительно улучшат качество ценой времени кодирования. Нет никаких оснований отключать эти опции, когда главным критерием является качество. Опции cmp=3:subcmp=3 выбирают функцию сравнения, дающую лучшее качество, чем стандартная. Вы можете поэкспериментировать с этим параметром (возможные значения смотрите на man странице), поскольку разные функции могут давать разный прирост в качестве в зависимости от исходного материала. Например, если Вы замечаете, что libavcodec производит слишком много блочных артефактов (квадратиков), то можете попытаться выбрать экспериментальный NSSE в качестве функции сравнения при помощи опции *cmp=10.

Для этого фильма полученный AVI будет 138 минут длинной и размером около 3Гб. И, поскольку Вы сказали, что размер файла значения не имеет, это вполне приемлемый результат. Однако, если все-таки хотите получить меньший размер файла, можете попробовать уменьшить битпоток. Увеличение битпотока имеет снижающийся эффект, поэтому, хотя мы можем ясно видеть улучшение от 1800Кбит/сек до 2000Кбит/сек, оно может быть не столь заметно выше 2000Кбит/сек.

Так как мы пропустили исходное видео через фильтр удаления шума, то, возможно, захочется вернуть какую-то его часть во время воспроизведения. Это, совместно с фильтром постобработки spp, существенно улучшит воспринимаемое качество и поможет избежать блочных артефактов в видео. Опцией autoq MPlayer'а Вы можете изменять величину производимой фильтром spp постобработки в зависимости от доступных ресурсов CPU. Вдобавок, на этом этапе Вы можете захотеть применить коррекцию гаммы и/или цвета для лучшего соответствия Вашему монитору. Например:

mplayer Harry_Potter_2.avi -vf spp,noise=9ah:5ah,eq2=1.2 -autoq 3