7.3. Кодирование семейством кодеков libavcodec
libavcodec
предоставляет возможность простого кодирования в множество интересных видео и
аудио форматов. Вы можете кодировать следующими кодеками (более или менее
свежий список):
Название видео кодека | Описание |
---|---|
mjpeg | Motion JPEG |
ljpeg | JPEG без потери качества |
jpegls | JPEG LS |
targa | Targa рисунок |
gif | GIF рисунок |
bmp | BMP рисунок |
png | PNG рисунок |
h261 | H.261 |
h263 | H.263 |
h263p | H.263+ |
mpeg4 | ISO стандарт MPEG-4 (DivX, Xvid совместимый) |
msmpeg4 | вариант пре-стандарта MPEG-4 от MS, v3 (он же DivX3) |
msmpeg4v2 | вариант пре-стандарта MPEG-4 от MS, v2 (используемый в старых ASF файлах) |
wmv1 | Windows Media Video, версия 1 (он же WMV7) |
wmv2 | Windows Media Video, версия 2 (он же WMV8) |
rv10 | RealVideo 1.0 |
rv20 | RealVideo 2.0 |
mpeg1video | MPEG-1 видео |
mpeg2video | MPEG-2 видео |
huffyuv | сжатие без потерь |
ffvhuff | huffyuv без потерь, модифицированный FFmpeg |
asv1 | ASUS Видео v1 |
asv2 | ASUS Видео v2 |
ffv1 | видео кодек без потерь из FFmpeg |
svq1 | Sorenson видео 1 |
flv | Sorenson H.263 используемый в Flash Видео |
flashsv | Flash Screen Video |
dvvideo | Sony Digital Video |
snow | экспериментальный кодек FFmpeg, основанный на вейвлетах |
zmbv | Zip Motion Blocks Video |
dnxhd | AVID DNxHD |
Первый столбец содержит названия кодеков, которые следует указывать после
vcodec
опции, например:
-lavcopts vcodec=msmpeg4
Пример с MJPEG сжатием:
mencoder dvd://2 -o title2.avi -ovc lavc -lavcopts vcodec=mjpeg -oac copy
Название аудио кодека | Описание |
---|---|
ac3 | Dolby Digital (AC-3) |
adpcm_* | Форматы Adaptive PCM, смотрите дополнительную таблицу |
flac | Free Lossless Audio Codec (FLAC) |
g726 | G.726 ADPCM |
libamr_nb | 3GPP Adaptive Multi-Rate (AMR) узкополосный |
libamr_wb | 3GPP Adaptive Multi-Rate (AMR) широкополосный |
libfaac | Advanced Audio Coding (AAC) - используя FAAC |
libgsm | ETSI GSM 06.10 full rate |
libgsm_ms | Microsoft GSM |
libmp3lame | MPEG-1 audio layer 3 (MP3) - используя LAME |
mp2 | MPEG-1 audio layer 2 (MP2) |
pcm_* | PCM форматы, смотрите дополнительную таблицу |
roq_dpcm | Id Software RoQ DPCM |
sonic | экспериментальный кодек от FFmpeg с потерями (lossy) |
sonicls | экспериментальный кодек от FFmpeg без потерь (lossless) |
vorbis | Vorbis |
wmav1 | Windows Media Audio v1 |
wmav2 | Windows 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
(а почти всегда так оно и
есть), и не зависят от внешних библиотек.
Название PCM/ADPCM кодека | Описание |
---|---|
pcm_s32le | signed 32-bit little-endian |
pcm_s32be | signed 32-bit big-endian |
pcm_u32le | unsigned 32-bit little-endian |
pcm_u32be | unsigned 32-bit big-endian |
pcm_s24le | signed 24-bit little-endian |
pcm_s24be | signed 24-bit big-endian |
pcm_u24le | unsigned 24-bit little-endian |
pcm_u24be | unsigned 24-bit big-endian |
pcm_s16le | signed 16-bit little-endian |
pcm_s16be | signed 16-bit big-endian |
pcm_u16le | unsigned 16-bit little-endian |
pcm_u16be | unsigned 16-bit big-endian |
pcm_s8 | signed 8-bit |
pcm_u8 | unsigned 8-bit |
pcm_alaw | G.711 A-LAW |
pcm_mulaw | G.711 μ-LAW |
pcm_s24daud | signed 24-bit D-Cinema Audio формат |
pcm_zork | Activision Zork Nemesis |
adpcm_ima_qt | Apple QuickTime |
adpcm_ima_wav | Microsoft/IBM WAVE |
adpcm_ima_dk3 | Duck DK3 |
adpcm_ima_dk4 | Duck DK4 |
adpcm_ima_ws | Westwood Studios |
adpcm_ima_smjpeg | SDL Motion JPEG |
adpcm_ms | Microsoft |
adpcm_4xm | 4X Technologies |
adpcm_xa | Phillips Yellow Book CD-ROM eXtended Architecture |
adpcm_ea | Electronic Arts |
adpcm_ct | Creative 16->4-bit |
adpcm_swf | Adobe Shockwave Flash |
adpcm_yamaha | Yamaha |
adpcm_sbpro_4 | Creative VOC SoundBlaster Pro 8->4-bit |
adpcm_sbpro_3 | Creative VOC SoundBlaster Pro 8->2.6-bit |
adpcm_sbpro_2 | Creative VOC SoundBlaster Pro 8->2-bit |
adpcm_thp | Nintendo GameCube FMV THP |
adpcm_adx | Sega/CRI ADX |
В идеале, Вы, наверное, хотели бы иметь возможность просто сказать кодировщику переключиться на "высокое качество" и начать кодирование. Это было бы замечательно, но, к сожалению, трудно реализуемо, поскольку различные опции кодирования, в зависимости от исходного материала, дают в результате различное качество. Так происходит потому, что сжатие зависит от визуальных свойств видео. Например, аниме и живая съемка имеют сильно отличающиеся свойства и, поэтому, требуют разные опции для получения оптимального результата. Хорошая новость состоит в том, что некоторые опции, такие как 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: Пытается предотвратить появление квадратиков, но лучше выполнить постобработку.
Следующие настройки — это примеры различных комбинаций опций кодирования, которые влияют на соотношение скорость-качество при той же величине целевого биптотока.
Все настройки кодирования проверялись на тестовом видео 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=2 | 6fps | 0дБ |
Высокое качество | 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:turbo | 15fps | -0.5дБ |
Быстрое | vcodec=mpeg4:mbd=2:trell:v4mv:turbo | 42fps | -0.74дБ |
Реального времени | vcodec=mpeg4:mbd=2:turbo | 54fps | -1.21дБ |
С этой возможностью
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
Использование:
mencoderinput.avi
-ooutput.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
Итак, Вы только что купили новенькую, блестящую копию фильма "Гарри Поттер и Тайная Комната" (в широкоэкранном формате, конечно) и хотите сделать рип этого 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