58 lines
3.5 KiB
Plaintext
58 lines
3.5 KiB
Plaintext
Задача: транскодировать поток дивх3 в мпег4.
|
||
Поток состоит из отдельных кадров, каждый из которых транскодируется независимо. Задача сводится к транскодированию кадра.
|
||
|
||
Чтобы это сделать, надо дать ответы на 2 вопроса:
|
||
1) Что именно хранится в кадре
|
||
2) Как именно хранится.
|
||
Ответ на 1-й вопрос _почти_ одинаков для дивх3 и мпег4.
|
||
Ответ на 2-й вопрос - существенные отличия.
|
||
|
||
Хранятся данные в виде последовательности битов. Суть процесса - прочитать биты кадра дивх3, понять, что именно там хранится, и записать это в виде битов в формате мпег4
|
||
|
||
Кадр делится на макроблоки размером 16 x 16 пикселей.
|
||
Кадр хранит:
|
||
- заголовок (хранится тип кадра, индексы в таблицы с данными, необходимые для работы и т.п.)
|
||
- данные всех макроблоков.
|
||
|
||
Т.е. фильм разрешения 640x480 содержит 40*30=1200 макроблоков в каждом кадре.
|
||
|
||
Каждый макроблок (в дальнейшем - МБ) хранит:
|
||
- заголовок МБ
|
||
- 6 каналов данных (4 на яркость и 2 на цветность)
|
||
|
||
МБ может быть двух видов:
|
||
- интра (независим от других кадров)
|
||
- интер (строится на основе предыдущих кадров)
|
||
Кадры I-frame состоят только из интра-макроблоков, а кадры P-frame могут иметь как те, так и другие.
|
||
|
||
Данные каждого канала МБ зависят от типа МБ:
|
||
- для интра-МБ хранится DC-уровень (что-то типа "усреднённого цвета" блока) и AC-коэффициенты (отклонения от этого уровня)
|
||
- для интер-МБ хранится вектор движения (т.е. куда мы должны передвинуть старый МБ, чтобы получить нынешний) и AC-коэффициенты (чтобы устранить огрехи при таком передвижении и добавить новые детали картинки)
|
||
Т.е. общий принцип хранения данных - базовое значение и данные для его коррекции.
|
||
|
||
И это справедливо и для дивх3, и для мпег4. Более того, похожий принцип работает и в mpeg1-2.
|
||
|
||
Стандарт мпег4 умеет больше, но мы это не рассматриваем. Я рассказываю лишь в рамках, необходимых для транскодера.
|
||
|
||
АС-коэффициенты - это как раз то, где заложен "битрейт". Чем больше этих коэффициентов, тем более качественное видео, и тем больше оно занимает. Эти коэффициенты как бы распределяются между всеми пикселями - каждому пикселю достаётся чуть-чуть. Если захочешь узнать про это побольше, вот ключевые слова:
|
||
- дискретное косинусное преобразование (DCT)
|
||
- преобразование Фурье
|
||
|
||
Далее. Основные уровни DC и motion vectors (MV) записываются не напрямую. Для каждого нового МБ по специальному алгоритму определяется "предсказание" - т.е. какое бы там могло бы быть значение DC или MV (на основании соседних МБ и МБ нескольких прошлых кадров). И записывается разница между предсказанным и реальным.
|
||
Поэтому, для декодирования, чтобы получить реальное значение этих уровней, нужно параллельно тоже делать предсказания, чтобы прибавить к ним записанную разницу.
|
||
|
||
Все эти исхищрения делаются только с одной целью - чтобы записанные в файл данные занимали как можно меньше. Достигается это с помощью особого метода кодирования этих всех чисел. Называется оно: "код переменной длины" (VLC), и используется во всех алгоритмах сжатия данных. Смысл в том, что разные числа кодируются разным количеством бит.
|
||
|
||
Все числа в потоке бит идут одно за другим, но, поскольку каждое занимает разное число бит, нам необходимо читать их все подряд. Если хотя бы в одном числе ошибка - все остальные числа будут прочитаны совершенно другими.
|
||
|
||
Для работы этого кодирования нужны VLC-таблицы, которые говорят, какие числа какой последовательностью бит кодировать.
|
||
Вот вроде бы и всё.
|
||
Теперь какие отличия. Отличаются:
|
||
- формат записи заголовков кадров и МБ
|
||
- методы предсказания DC и MV
|
||
- порядок следования AC-коэффициентов
|
||
- VLC-таблицы
|
||
|
||
-------------------------------------
|
||
|