Gregory Shimansky (zoltan0) wrote,
Gregory Shimansky
zoltan0

Кодирование видео в H264 (часть 2)

Первая часть была тут.

По многочисленным просьбам перехожу к практической части. Правда всё равно надо написать как собственно видео кодируется. Поскольку я не книгу тут пишу, напишу очень коротко, со ссылками на материалы для самостоятельного изучения.

Видео кодируется по кадрам. Для кодирования используется цветовое пространство YUV, а не RGB. Почему, сейчас объясню. Человеческий глаз гораздо сильнее чувствует яркость, а не цвета. Поэтому две цветовых компоненты можно передавать не целиком, а сильно их урезав. Как правило используется вариант 4:2:0 (логики в этом названии мало, в отличии от 4:2:2, но оно устоялось). Так что яркость передаётся на 100%, а цвет только на 25%. Получается что пикселей в цветовых кадрах в 4 раза меньше чем в яркостном, так как они в 2 раза меньше по горизонтали и по вертикали.

Каждый кадр традиционно разбивают на так называемые макроблоки размером 16x16 пикселей для Y, и соответственно 8x8 для U и V. В h264 допускается дополнительно разбиение на части размером вплоть до 4x4 для Y, и 2x2 для U и V. Макроблоки могут кодироваться разными способами. В первую очередь это intra (внутри кадра) и inter (через кадр) варианты.

Intra кодирования используется для кодирования ключевых кадров I (intra) и для кодирования в inter кадрах объектов, которые в других кадрах отсутсвуют. I кадры можно грубо сравнить с JPEG, они целиком состоят из intra макроблоков, но при этом используют самое большое количество бит для кодирования. Inter кодирование используется для кодирования P (predicted) и B (bi-predicted) кадров. В этом случае макроблоки ищут в других соседних кадрах, указывается вектор смещения и разница (которая чем меньше тем лучше) между соседним кадром и тем что должно быть. В случае дополнительного разбиения макроблока на подчасти вектора смещения можно указывать для каждой части отдельно. Это тратит больше бит в потоке, но даёт возможность передавать более сложное движение или больше деталей. Поиск наиболее подходящего варианта сдвига макроблока в соседних кадрах называют motion estimation. Эта часть подирования занимает львиную долю времени при кодировании видео. В h264 допускается вплоть до четверть-пиксельного (qpel) указание смещения макроблока, что сильно добавляет точности и качества результата, но существенно увеличивает время кодирования. Для полу- или четверть- пиксельного предсказания движения кадры интерполируются по специальным алгоритмам заложенным в стандарте, но памяти при этом используется тоже до 16 раз больше.

Для кодирования макроблоки подвергаются косинусному преобразованию после чего наиболее значащие коэффициенты получаются в левом верхнем углу матрицы 16x16 или меньше для подразбиений и для цветовых макроблоков. Дополнительно макроблок подвергается квантизации, то есть, если грубо, выкидывают младшие биты у чисел полученных в результате косинуснового преобразования. Чем больше фактор квантизации, тем больше нулей получится в результате, а при кодировании в битовый поток это даёт возможность сэкономить биты. При этом теряется информация, поэтому при декодировании получается не совсем то что должно было получиться.

После квантизации, вектора, квантизованные коэффициенты, информация о разбиении, индексы кадров, с которыми надо сравнивать макроблок если он inter, и другая информация кодируются энтропийным кодированием. В h264 есть два варианта, CAVLC (context adaptive variable length codes) и CABAC (context adaptive binary arythmetic codes). Второй кодирует всегда лучше, до 15%, но существенно сложнее при декодировании, правда сейчас это важно только для встроенных или малоскоростных устройств типа мобильников. Для фильмов всегда используют CABAC.

Следующая часть будет уже про опции кодирования.
Tags: h264, video
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 14 comments