Тема фрейма MPEG

Тема фрейма завжди має довжину 32 біта і вирівняний по межі цілого байта B перших 12 бітах записані одиниці для синхронізації, а значення інших вказані в табл 142

12 біт, зайнятих одиницями, називаються синхрогрупи Якщо в процесі роботи декодер десь втратить нитку, можна буде знайти найближчу синхрогрупи і перезапустити декомпрессор з цього місця

Поява помилкових синхрогрупи може утруднити надійну синхронізацію програми декодування Хоча стандарт гарантує, що помилкові синхрогрупи не можуть зустрітися коректно сформованому потоці аудіоданих, це всетаки може трапитися, якщо зявляться помилки і закодовані дані будуть спотворені Якщо передати в декодер додаткову інформацію про вхідний потоці бітів (наприклад, в декодер могла б бути передана інформація про те, що потік бітів відповідає формату MPEG-I Layer I), то можна було б використовувати додаткові біти заголовка як продовження синхрогрупи Цей стандарт такжетребует, щоб відразу послезаголовказаписывалась контрольна сума (CRC) B ній перевіряються помилки в заголовку і найбільш важливої ​​частини закодованих даних Якщо помилки виявляються, то декодер може просто пропустити цей фрейм (відключивши вихідний сигнал, або повторивши попередній фрейм для того, щоб приховати втрату даних) Потім слід повторна синхронізація, і відтворення звуку триває з чергового фрейма, що не містить помилок

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

Таблиця 142

Байтов

Біти

Опис

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

Індекс швидкості передачі бітів, див табл 144

2

Індекс частоти дискретизації, див табл 143

1

Заповнення: 1, якщо використовується додатковий слот

1

Неофіційний

3

2

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

11 = моно

2

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

1

Ознака авторських прав: 1, якщо авторські права накладені

1

Ознака оригіналу: 1, якщо це оригінальна запис

2

Предискаженіем

Таблиця 143 Коди частот дискретизації MPEG

Код

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

для MPEG-1, Гц

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

для MPEG-2, Гц

00

44100

22050

01

48000

24000

10

32000

16000

11

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

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

(В бітах за секунду) Зазначені величини зберігаються в заголовку у вигляді індексів табл 143, 144 Їх значення записуються в заголовок кожного кадру Зазвичай в ході кодування частота дискретизації при переході від фрейма до фрейму не змінюється, зате велику користь приносить можливість використання різних швидкостей передачі даних для різних фреймів Завдяки можливості варіювання швидкості передачі при переході від одного фрейма до іншого формат MPEG дозволяє на практиці застосовувати швидкості, величини яких лежать між числами, представленими в даних таблицях B особливих умовах передача бітів може вестися з довільною швидкістю, хоча вона повинна задовольняти деяким умовам (докладніше про це в наступному розділі «Сторінки і фрейми»)

Щоб уникнути плутанини з неправдивими синхрогрупи, заборонено вико-

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

Частина 3 стандарту MPEG-2 передбачає дві додаткові можливості зберігання звуку в порівнянні з частиною 3 стандарту MPEG-I По-перше, додається підтримка нових низьких швидкостей передачі бітів і нових частот дискретизації По-друге підтримка багатоканального звуку з ефектом присутності

Таблиця 144 Коди швидкості передачі бітів 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 декодер їх повністю ігнорує

Лістинг 147 Змінні для зберігання заголовків блоків 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 режимі обєднаного стерео вони застосовуються в меншому кількості завдяки тому, що частина інформації використовується спільно двома каналами Цей режим чудово підходить для обробки звичайних Стереофонічна, в яких відмінності між правим і лівим каналами не дуже великі Докладніше ми обговоримо це пізніше

Лістинг 148 Декодування заголовка фрейму 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] &amp 0xF0) = 0xF0)) {

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

cerr &lt&lt &quotSyncword 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] &amp 0xF0)&gt&gt4

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

int samplingRateIndex = (_header[2] &amp 0x0C)&gt&gt2

_samplingRate = samplingRateTable[_id][samplingRateIndex]

_padding = (_header[2] &amp 0x02)&gt&gt1

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

_mode = (_header[3] &amp 0xC0) &gt&gt 6

_modeExtension = (_header[3] &amp 0x30)&gt&gt4

switch(_mode) {

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

_channels = 2

_bound = 32

break

case 1: / / Обєднане стерео: у частині

/ / Піддіапазонів використовується

/ / Кодування інтенсивності

_channels = 2

_bound = (_modeExtension + 1)&lt&lt2

break

case 2: / / Двоканальне: два незалежні канали

_channels = 2

_bound = 32

break

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

_channels = 1

_bound = 0

break

}

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

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

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

_buffer = _header+4

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

return false / / Тема прочитаний успішно

}

Для простоти Не будемо перевіряти контрольну суму просто пропустимо її,

якщо вона нам зустрінеться

Джерело: Кінтцель Т Керівництво програміста по роботі зі звуком = A Programmers Guide to Sound: Пер з англ М: ДМК Пресс, 2000 432 с, іл (Серія «Для програмістів»)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*