Все кодеки, предназначенные для сжатия видео можно разделить на два типа: с устранением пространственной избыточности и устранением временной избыточности. К первому типу можно отнести M-JPEG кодеки. Ко второму типу можно отнести все Mpeg кодеки. Суть первого типа кодеков сводится к сжатию каждого кадра, по JPEG алгоритму. При этом каждый кадр сжимается независимо от другого.
Второй тип кодеков производит сравнение двух соседних кадров. При точном совпадении кадров, считается, что записывать второй кадр не нужно. При каких-то незначительных изменениях, производится запись только изменившейся части, остальная часть забирается из предыдущего кадра. По этому алгоритму работают все Mpeg кодеки и их клоны: XVID, DivX, WMV, Quick Time…
В связи с тем, что Mpeg кодеки (и их клоны) работают по одному и тому же алгоритму, все они подвержены одним и тем же искажениям. Можно вывести закономерности, влияющие на качество результирующего видео. По материалам авторитетного сайта www.doom9.org и моим собственным исследованиям, я вывел некоторые конкретные факторы, влияющие на качество сжатого видео кодеками второго типа.
Я насчитал их 6 штук:
- Разрешение
- Битрейт
- B-frames
- Фильтры
- Низкий уровень движения в фильме
- Темное кино
1. Разрешение (или размер картинки) при сжатии видео имеет не маловажную роль. Нам кажется, что увеличение разрешения видео несёт только благо, но… При увеличении разрешения требуется больше поток для каждого кадра. Если приводить это к пикселям в кадре, то при разрешении 320*240 получается 76800 пикселей в кадре. То же самое изображение при 384*288 будет иметь 110592 пикселей в кадре. Имеем увеличение в 1,44 раза, что должно повлечь увеличение битрейта кодека (для получения картинки того же качества) во столько же раз. Как видим, минимальное изменение разрешения картинки, влечёт за собой значительные изменения потока. Для обобщения понятия о приемлемости качества, обычно вводят такое понятие, как b/(s*f) (b-битрейт, измеряется в бит/секунда; s-количество пикселей в одном кадре, высчитывается умножением высоты на ширину; f - число кадров в секунду) и оно не должно быть ниже определённого порога. По большому счёту, это поток, приходящийся на один пиксель. Для определения этого параметра я пользуюсь пакетом GordianKnot. Он предназначен для обработки видео и вычисляет этот параметр автоматически. При снижении этого параметра ниже 0,19 сигнализирует, что сжатие неприемлемо высоко.
Проблема выбора разрешения при сжатии стоит достаточно остро. С одной стороны, с большим разрешением гораздо лучше видны мелкие детали, но при этом нужно увеличивать битрейт кодека, - это не всегда приемлемо, довольно часто мы ориентируемся на размер файла, который нам надо получить (фильм ->1CD). Ниже приведены рассуждения именно для ограниченного размера. То есть, получается, что мы имеем какой-то битрейт, выше которого мы не можем прыгнуть.
Я вычисляю его в уже упомянутом мной GordianKnot (подробно описано в статье "Личный опыт работы с DivX"). Там можно загрузить обрабатываемое видео, а можно просто задать продолжительность фильма, там же указать размер имеющегося аудио или битрейт с которым оно будет зажиматься, выбираем каким кодеком будем обрабатывать (DivX3 или DivX5), на сколько и каких CD это будет укладываться... В результате, получаем максимальный битрейт, с которым можно кодировать видео. При кодировании видео, мы выставляем этот битрейт и больше его не трогаем. Теперь можно попробовать поиграться с разрешением видео. При увеличении разрешения видео, как я уже упоминал, улучшается детализация картинки, но при ограниченном битрейте кодера, мы уже не будем получать улучшения детализации. Детализация будет расти до определённого разрешения, потом начнётся размытие картинки и разваливание её на квадраты.
Проследить, как ведёт себя параметр b/(s*f) в зависимости от изменения разрешения можно при помощи то же программы GordianKnot. На вкладке разрешение, передвигайте слайдер и программа будет выводить наиболее близкие значения ширины и высоты (перед эти на вкладке битрейт нужно обязательно ввести все параметры в соответствии с написанным выше). Делитель ширины и делитель высоты нужно выставить в 16. Вместе с изменением разрешения будет автоматически пересчитываться и значение b/(s*f). Таким образом вы можете подбирать максимальное разрешение проверяя его по параметру b/(s*f).
Получается, что для определённого битрейта имеем определённое разрешение, при котором детализация максимальна (на конкретном видео материале).
Вернёмся к формуле b/(s*f) (назовём этот параметр Q). Глядя на нё, можно сказать, что в качестве картинки участвует битрейт, разрешение и количество кадров в секунду. Битрейт = Const (максимум для нашего размера файла); кадров в секунду = Const (можно их уменьшить, но это не всегда будет приятно смотреть, за исключением процесса Inverse telecine); разрешение = Variable. Получаем, что изменяя разрешение, мы можем повысить или понизить качество картинки в целом.
Моими экспериментами было установлено, что при Q>0.4, мы получаем вполне не плохую картинку для данного разрешения. С увеличением разрешения, параметр Q будет падать, соответственно, общее качество расти уже не будет, а к Q=0.2 упадёт до неприемлемого уровня.
2. Про выбор битрейта я уже написал чуть выше, как правило он выбирается для получения определённого размера файла. Но, допустим, у вас задача в другом, вы не постоите за размером файла, но хотите получить максимальное качество. Возьмём уже известный нам параметр Q. Для получения максимального качества Q должен быть больше или равен 0.8. Это возможно подбором битрейта (будем думать, что разрешение вы не хотите изменять). Но может получиться такая ситуация, что при увеличении битрейта размер файла видео не будет расти. Это будет обозначать одно: вы достигли максимального качества для данной картинки и разрешения. Как дальше будет рассказано, содержимое фильма так же имеет важную роль в качестве сжатия.
3. В кодере DivX5 появилось новшество, которое позволило получить более высокое качество, по сравнению с предыдущими версиями. Это - B-frames. При работе B-frame используют не только предыдущий кадр, но и следующий (P-frame рассчитывал картинку только по предыдущему кадру), что даёт нам дополнительный толчок для повышения качества картинки. B-frame получаются очень маленькие, значит можно больше объём выделить на P-frame.
Короче, B-frame не требует никакой настройки, достаточно просто включить эту функцию и качество сжатого видео должно повысится.
4. Теперь я хочу рассмотреть работу фильтров. При сжатии видео, на сжимаемость картинки влияет наличие множества мелких деталей, ярких переходов… короче, мягкость картинки. Здесь и далее, про видео, которое можно сильно сжать без ощутимых потерь, я буду писать "хорошо сжимается".
Чем более чёткая картинка, тем тяжелее кодеру будет её сжимать. Применяя разные фильтры, мы можем менять чёткость картинки, тем самым меняем условия работы кодера. Так, применяя фильтр Smoother, мы делаем картинку более размытой, после этого, кодер будет работать в облегчённых условиях (видео хорошо сжимается), и после сжатия картинка будет выглядеть на много лучше, чем без применения этого фильтра. Здесь идёт речь о кодировании в нужный объём (например при Q=0.3), а не получения максимального качества (где битрейт увеличивают до получения высокого качества).
При изменении разрешения видео, мы так же включаем какой-нибудь фильтр, за частую не задумываясь об этом. Мы можем включить разные режимы перерасчёта картинки: Nearest neighbor (берётся ближайшая точка оригинала), Bilinear (линейное усреднение в матрице 2х2) или Bicubic (кубическое усреднение в матрице 4х4). Есть так же другие способы, но их основа Bilinear или Bicubic.
С применением Nearest neighbor сложность картинки практически не изменяется (соответственно не изменяется сжимаемость видео), но качество картинки заметно падает, появляются неожиданные артефакты. Единственный плюс этого метода, очень маленькая загрузка процессора. Для устранения артефактов, нужно уменьшать картинку в N раз (для увеличения этот фильтр вообще не годится). N - обязательно целое число.
Применять Bilinear, рекомендуется для уменьшения картинки, для увеличения он так же не очень хорош. При перерасчете Bilinear методом, картинка становится более мягкой, что способствует облегчённому режиму работы кодека (видео хорошо сжимается), вместе с этим, размываются мелкие детали.
Bicubic годится для любого рода работ, но в основном его рекомендуют для увеличения. После применения Bicubic интерполяции происходит подчёркивание мелких деталей, контуров объектов. Это усложняет сжатие и для кодирования того же видео с тем же качеством, потребуется повышенный битрейт.
Общее для изменения разрешения: при увеличении разрешения требуется повышенный битрейт, во столько раз, во сколько будет больше пикселей в кадре, но увеличение используется редко, чаще используют уменьшение. Уменьшение используют для того, что бы уложить данный видео материал в определённые размеры файла.
Немного повторюсь из теории: Для того, что бы уложить видео в определённые размеры файла, мы вычисляем битрейт для заданных длины фильма и размера файла. Далее, мы выставляем этот битрейт в кодере и он теперь неприкасаем. Кодируем видео, видим, что качество полученного видео материала получилось плохое (хотя это можно предсказать заранее на основании Q). В этом случае, мы можем уменьшить частоту кадров (это не всегда приемлемо) или уменьшить разрешение. Уменьшение разрешения можно отслеживать всё по тому же параметру Q. Как я уже сказал, уменьшая размер картинки, можно добиться максимального общего качества для данного видео материала. Теперь я расскажу о независящих от кодера параметрах, влияющих на качество сжатого видео.
5. Форматы Mpeg, регистрируют не каждый кадр, а изменение картинки от кадра к кадру. В результате имеем, что в фильмах с низким движением, кадры изменяются мало, соответственно нужно мало места на промежуточные кадры (P-frames, B-frames). Получается, что мы можем получить достаточно качественную картинку при более низком параметре Q. Как количество движения нужно понимать не только передвижение объектов, но и вспышки, мерцание, дрожание объектов. На практике, могу сказать, что сценическое освещение (вспышки, резко перемещающийся свет) требует резкого повышения битрейта, для получения качественной картинки.
6. После наблюдения за качеством работы кодеков Mpeg с разными фильмами было выявлено, что очень качественно сжимаются фильмы с тёмными фонами. Здесь появляется такая же ситуация, как и в фильмах с малым уровнем движения, при малых уровнях Q, мы получаем приемлемое качество. Разумного объяснения этому феномену у меня нет. Быть может составляющие видео (YUY2) при тёмном изображении стремятся к 0, размах их достаточно низок и небольшие изменения легко укладываются в маленькие промежуточные кадры.
Выводы:
При работе с кодеками второго вида перед нами стоит проблема выбора разрешения, при котором качество картинки будет достаточно высоким. Для приблизительной оценки качества можно пользоваться оценочным параметром Q, введённым мной в этой статье. Повышать качество кодирования можно повышением битрейта (при сжатии в объём это не применимо), включением B-frames, включением сглаживающих фильтров. При выборе всех этих параметров стоит учитывать факторы не зависящие от кодера: количества движения в видео материале и темноту фона, на котором происходит действие.
Дополнительные материалы
DivX. Основы создания видео на компьютереЗапись DVD видео
Цифровой звук