Главная » Программирование звука » Заголовок фрейма MPEG

0

Заголовок фрейма всегда имеет длину 32 бита и выровнен по границе целого байта.  B  первых  12  битах  записаны  единицы   для  синхронизации,  а  значения остальных указаны в табл. 14.2.

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

Появление  ложных  синхрогрупп  может  затруднить  надежную  синхронизацию программы декодирования. Хотя стандарт гарантирует, что ложные синхрогруппы не могут встретиться в корректно сформированном потоке аудиоданных, это всетаки может случиться, если появятся ошибки и закодированные данные будут искажены. Если передать в декодер дополнительную информацию о входящем потоке битов (например, в декодер могла бы быть передана информация о том, что поток битов  соответствует формату  MPEG-I  Layer  I), то можно  было  бы  использовать дополнительные  биты  заголовка  как  продолжение  синхрогруппы.  Этот  стандарт такжетребует, чтобы сразу послезаголовказаписывалась контрольная сумма (CRC). B ней проверяются ошибки в заголовке и наиболее важной части закодированных данных. Если ошибки обнаруживаются, то декодер может просто пропустить этот фрейм (отключив выходной сигнал, либо повторив предыдущий фрейм для того, чтобы скрыть потерю данных). Затем следует повторная синхронизация, и воспроизведение звука продолжается с очередного фрейма, не содержащего ошибок.

B  заголовке  фрейма  содержатся  сведения  о  частоте  дискретизации  несжатых данных (в количестве отсчетов за секунду) и о скорости передачи сжатых данных

Таблица 14.2.

Байтов

Биты

Описание

0

8

Все имеют значение 1, байт используется для синхронизации

1

4

Все имеют значение 1, байт используется для синхронизации

1

ID: 0 служит признаком того, что использованы расширения MPEG-2

2

Уровень: 11=Layer 1, 10=Layer 2, 01=Layer 3, 00 зарезервировано

1

Бит защиты: 0, если есть CRC

2

4

Индекс скорости передачи битов, см. табл. 14.4

2

Индекс частоты дискретизации, см. табл. 14.3

1

Заполнение: 1, если используется дополнительный слот

1

Неофициальный

3

2

Режим: 00=стерео, 01 объединенное стерео, 10=двухканальный,

11=моно

2

Расширение режима: поддиапазон минимальных частот для глубокого стерео

1

Признак авторских прав: 1, если авторские права наложены

1

Признак оригинала: 1, если это оригинальная запись

2

Предыскажение

Таблица 14.3. Коды частот дискретизации MPEG

Код

Частота дискретизации

для MPEG-1, Гц

Частота дискретизации

для MPEG-2, Гц

00

44100

22050

01

48000

24000

10

32000

16000

11

Зарезервировано

Зарезервировано

(в  битах  за  секунду).  Указанные  величины  хранятся  в  заголовке  в  виде  индексов  табл.  14.3,  14.4.  Их  значения  записываются  в  заголовок  каждого  фрейма. Обычно   в   ходе   кодирования   частота   дискретизации   при   переходе   от   фрейма к  фрейму  не  меняется,  зато  большую  пользу  приносит  возможность  использования  различных  скоростей  передачи  данных  для  разных  фреймов.  Благодаря  возможности   варьирования   скорости   передачи   при   переходе   от   одного   фрейма к  другому  формат  MPEG  позволяет  на  практике  применять  скорости,  величины которых  лежат  между  числами,  представленными  в  данных  таблицах.  B  особых условиях   передача   битов  может  вестись   с  произвольной   скоростью,  хотя  она должна удовлетворять некоторым условиям (подробнее об этом в следующем разделе «Страницы и фреймы»).

Чтобы  избежать  путаницы  с  ложными  синхрогруппами,  запрещено  использо-

вать значения, составленные из единиц.

Часть 3 стандарта MPEG-2 предусматривает две дополнительные возможности хранения звука по сравнению с частью 3 стандарта MPEG-I. Во-первых, добавляется поддержка новых низких скоростей передачи битов и новых частот дискретизации. Во-вторых поддержка многоканального звука с эффектом присутствия.

Таблица 14.4. Коды скорости передачи битов MPEG

Скорость передачи битов

в MPEG-1

Скорость передачи битов

в MPEG-2

Код

Layer 1             Layer 2

Layer 3

Layer 1            Layer 2

Layer 3

0000

Произволь      Произволь-

Произволь-

Произволь      Произволь-

Произволь-

ная

ная

ная

ная

ная

ная

0001

32

32

32

32

8

8

0010

64

48

40

48

16

16

0011

96

56

48

56

24

24

0100

128

64

56

64

32

32

0101

160

80

64

80

40

40

0110

192

96

80

96

48

48

0111

224

112

96

112

56

56

1000

256

128

112

128

64

64

1001

288

160

128

144

80

80

1010

320

192

160

160

96

96

1011

352

224

192

176

112

112

1100

384

256

224

192

128

128

1101

416

320

256

224

144

144

1110

448

384

320

256

160

160

1111

*

*

*

*

*

*

Дополнительные  данные,  необходимые  для  работы  с  мультиканальным  звуком, хранятся в виде обычного стереопотока, в котором они размещаются между фреймами. Стандартный MPEG-1 декодер их полностью игнорирует.

Листинг 14.7. Переменные для хранения заголовков блоков MPEG

private:

bool ParseHeader();   // Разбор заголовка  очередного фрейма. char _id;             // 1 для MPEG-1, 0 для расширений  MPEG-2.

char _layer;

char _protection;    // 1, если  проверка CRC не   производится.

long _bitRate;       // Общее  количество битов в секунду. long _samplingRate;  // Отсчеты в  секунду.

bool _padding;       // У этого пакета есть

// дополнительная страница.

char _private;       // Неофициальный  бит.

char _mode;          // Одноканальный, двухканальный,

// стерео и  т.д.

char _modeExtension; // Тип     кодировки  стерео.

char _bound;         // Поддиапазон, в котором меняется

// тип     кодировки  стерео.

bool _copyright;     // Истина, если  есть  авторские  права.

bool _original;      // Истина, если оригинал.

char _emphasis;      // Порядок постобработки  аудио.

int _channels;       // Количество  каналов.

int _headerSpacing;  // B байтах.

Назначение  большей  части  этих  переменных  вполне  очевидно.  Правда,  иногда создается  впечатление,  что  кое-что сделано  не  так,  как можно  было  бы  ожидать,  а  наоборот  (например,  в  бит  защиты  _protection записывается  единица, если фрейм не защищен). O переменных, описывающих режимы (_mode), мы поговорим отдельно.

Формат  MPEG-1  поддерживает  установки  для  четырех  каналов.  B  обычных стереои двухканальном режимах хранятся два независимых потока сжатых данных. B режиме объединенного стерео они применяются в меньшем количестве благодаря тому, что часть информации используется совместно двумя каналами. Этот режим отлично подходит для обработки обычных стереопрограмм, в которых различия между правым и левым каналами не очень велики. Подробнее мы обсудим это позднее.

Листинг 14.8. Декодирование заголовка фрейма MPEG

static short bitRateTable[2][4][16] = {     // ID, Уровень, код.

{                    // Бит   ID == 0 для MPEG 2 с  низкой

// скоростью передачи  битов.

{0 },             // Зарезервировано.

// Layer 1.

{0,32,48,56,64,80,96,112,12 8,144,160,176,192,224,256,0 },

// Layer 2 и  Layer 3 совпадают.

{0,8,16,24,32,4 0,48,56,64,80,9 6,112,12 8,144,160,0 },

{0,8,16,24,32,40,48,56,64,80,96,112, 128,144, 160, 0 },

}, {     // Бит   ID == 1 для скоростей  передачи битов MPEG 1.

{0 }, // Зарезервировано.

// Layer 1.

{0,32,64,9 6,12 8,160,192,224,256,288,32 0,3 52,3 84,416,448,0 },

// Layer 2.

{0,32,48,56,64,80,9 6,112,12 8,160,192,224,2 56,32 0,3 84,0 },

// Layer 3.

{0,32,40,48,56,64,80,96,112,128,160,192,224,256,32 0,0 },

}};

static long samplingRateTable[2][4] = {     // ID, Код.

{22050,24000,16000,0},   // Частоты дискретизации  MPEG 2.

{44100,48000,32000,0}    // Частоты дискретизации  MPEG 1.

};

// Разбираем заголовок, возвращаем  ИСТИНУ,

// если  заголовков  больше нет.

bool DecompressMpeg::ParseHeader() { FillBuffer();             // Заполняем  буфер. if (_bufferEnd _header < 4)

return true;           // Больше нет  фреймов.

if((_header[0] != 0xFF)||((_header[1] & 0xF0) != 0xF0)) {

// Синхрогруппа  не   найдена.

cerr << "Syncword not found.";

return true;           // Больше нет  фреймов.

}

_id = (_header[1] & 8)>>3;           // 1 для MPEG-1,

// 0 для MPEG-2

_layer = (_header[1] >> 1) & 3;    // Декодируем

_protection = (~_header[1] & 1);     // 0->CRC, 1->нет  CRC

int bitrateIndex = (_header[2] & 0xF0)>>4;

_bitRate = bitRateTable[_id][_layer][bitrateIndex] * 1000;

int samplingRateIndex = (_header[2] & 0x0C)>>2;

_samplingRate = samplingRateTable[_id][samplingRateIndex];

_padding = (_header[2] & 0x02)>>1;

_private = (_header[2] & 0x01);

_mode = (_header[3] & 0xC0) >> 6;

_modeExtension = (_header[3] & 0x30)>>4;

switch(_mode) {

case 0:                // Стерео: все поддиапазоны.

_channels = 2;

_bound = 32;

break;

case 1:                // Объединенное  стерео: в части

// поддиапазонов используется

// кодирование интенсивности.

_channels = 2;

_bound = (_modeExtension + 1)<<2;

break;

case 2:                // Двухканальное: два  независимых канала.

_channels = 2;

_bound = 32;

break;

case 3:         // Одноканальное.

_channels = 1;

_bound = 0;

break;

}

_copyright = (_header[3] & 0x08);

_original = (_header[3] & 0x04);

_emphasis = (_header[3] & 0x03);

_buffer = _header+4;

if (_protection) _buffer += 2;  // Skip 2-byte CRC

return false;     // Заголовок  прочтен успешно.

}

Для  простоты  не  будем  проверять  контрольную  сумму   просто  пропустим  ее,

если она нам встретится.

Источник: Кинтцель Т.  Руководство программиста по работе со звуком = A Programmer’s Guide to Sound: Пер. с англ. М.: ДМК Пресс, 2000. 432 с, ил. (Серия «Для программистов»).

По теме:

  • Комментарии