Аудіо MPEG

B частини, що залишилася цієї глави ми сконцентруємо увагу на аудіоспеціфікаціі третій частині MPEG-I Щоб проілюструвати обговорювані принципи, я припускаю розробити програму, повною мірою реалізовує механізм декомпресії звуку першого і другого рівнів

B стандарті MPEG використовується підхід, відмінний від підходів, які застосовуються при створенні інших стандартів Третя частина MPEG детально описує відповідний MPEG-формат двійкового потоку, проте в нійНЕописується метод компресії Спочатку це може здатися дивним, проте насправді мова йде про важливе властивість стандарту

Двійковий потік MPEG, по суті, визначає спектральний склад звуку і його зміна з плином часу Для економії місця компресор вибірково відкидає інформацію Стандарт описує, як кодується що залишається інформація і як декомпрессор може відновити вибірки ІКМ на основі даних з потоку бітів в кодуванні MPEG Так як процес кодування в стандарт не включений, розробники можуть вільно користуватися різноманітними методами, щоб визначити, яка інформація є важливою Серед цих методів могли б зустрітися спрощені кодувальники для додатків, працюють зі звуком низької якості, або кодувальники, призначені для роботи зі звуками ocoбоготіпа (наприклад, високоякісна компресія оркестрової музики, швидше за все, відрізнятиметься від високоякісної компресії розмовної мови)

Загальна структура

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

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

Лістинг 141 Програма mpegh

#ifndef MPEG_H_INCLUDED

#define MPEG_H_INCLUDED

#include &quotaudioh&quot

#include &quotcompressh&quot

class DecompressMpeg: public AbstractDecompressor {

private:

private:

AudioSample _sampleStorage[2][1152]

AudioSample * _pcmSamples [2] / / Відліки для лівого / правого

/ / Каналів,

int _samplesRemaining / / Кількість решти

/ / Від останнього кадру відліків

void NextFrame () / / Читання і декомпресія

/ / Чергового фрейма

public:

DecompressMpeg(AudioAbstract &ampa)

~DecompressMpeg()

size_t GetSamples(AudioSample *outBuff, size_t len)

void MinMaxSamplingRate(long *min, long *max, long *preferred)

{

*min=*max=*preferred=_samplingRate

}

void MinMaxChannels(int *min, int *max, int *preferred) {

*min=*max=*preferred=_channels

}

}

#endif

Загальнодоступні частини класу DecompressMpeg не є патентованими Метод GetSamples, наприклад, копіює відліки з буферів вибірок, викликаючи для їх повторного заповнення метод NextFrame

Лістинг 142 Метод GetSamples для формату MPEG

size_t DecompressMpeg::GetSamples(AudioSample *outBuff, size_t wanted) {

long remaining = wanted

while(remaining &gt O) {

if (_samplesRemaining == 0) {/ / Буфер порожній

NextFrame () / / Отримуємо порцію даних з потоку MPEG

if (_samplesRemaining == 0) / / Дані скінчилися

return wanted-remaining

}

switch(_channels) {

case 1: / / Моно, просто копіюємо лівий канал

while((_samplesRemaining &gt 0) &amp&amp (remaining &gt O)) {

*outBuff++ = *_pcmSamples[0]++

_samplesRemaining–

remaining–

}

break

case 2: / / Стерео, копіюємо обидва канали while ((_samplesRemaining> 0) && (remaining> 0)) {

* OutBuff + + = * _pcmSamples [0] + + / / Лівий

* OutBuff + + = * _pcmSamples [l] + + / / Правий

_samplesRemaining–

remaining = 2

}

break

}

}

return wanted-remaining

}

Цей метод має досить складний механізм B частини, що залишилася даної глави ми обговоримо окремі компоненти цього механізму більш докладно

Лістинг 143 Програма mpegcpp

# Include / / # Include для старих версій компіляторів

# Include / / # Include для старих версій компіляторів

# Include / / # Include для старих версій компіляторів

# Include / / # Include для старих версій

компіляторів

#include &quotaudioh&quot

#include &quotcompressh&quot

#include &quotmpegh&quot

/ / Конструктор DecompressMpeg :: DecompressMpeg (AudioAbstract & a)

:AbstractDecompressor(a) {

_samplesRemaining = 0

NextFrame () / / Читаємо перший фрейм

/ / Кодування: MPEG-

cerr &lt&lt &quotEncoding: MPEG-&quot &lt&lt ((_id==0)&quot2&quot:&quot1&quot)

/ / Рівень

cerr &lt&lt &quot Layer &quot &lt&lt static_cast&ltint&gt(_layer)

cerr &lt&lt &quot\n"

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

cerr &lt&lt &quotSampling Rate: &quot &lt&lt _samplingRate &lt&lt &quot\n"

switch(_mode) {

/ / Тип: Стерео

case 0: cerr &lt&lt &quotMode: Stereo\n" break

/ / Тип: Обєднаний стерео

case 1: cerr &lt&lt &quotMode: Joint Stereo\n" break

/ / Тип: Двоканальний

case 2: cerr &lt&lt &quotMode: Dual Channel\n" break

/ / Тип: Одноканальний

case 3: cerr &lt&lt &quotMode: Single Channel\n" break

}

/ / Швидкість передачі бітів

cerr &lt&lt &quotBitrate: &quot &lt&lt _bitRate &lt&lt &quot\n"

switch(_emphasis) {

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

case 0: cerr &lt&lt &quotEmphasis: none\n" break

/ / Предискаженіем: 50/15

case 1: cerr &lt&lt &quotEmphasis: 50/15\n" break

/ / Предискаженіем: зарезервовано

case 2: cerr &lt&lt &quotEmphasis: reserved\n" break

/ / Предискаженіем: ITU J17

case 3: cerr &lt&lt &quotEmphasis: ITU J17\n" break

}

/ / Ступінь стиснення (приблизно):

fprintf(stderr,&quotApproximate Compression Ratio: %51f:1\n&quot,

_samplingRate*160*_channels/_bitRate)

}

/ / Деструктор

DecompressMpeg::~DecompressMpeg() {

}

Джерело: Кінтцель Т Керівництво програміста по роботі зі звуком = 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>

*

*