Слоти і фрейми

Фрейми MPEG вимірюються всторінках,або слотах (slot) Для Layer I сторінка дорівнює 4 байтам, для Layer 2 і Layer 3 слот становить 1 байт Завдання пошуку чергового заголовка вирішується елементарно: ми знаємо швидкість передачі бітів в вступників даних і частоту дискретизації одержуваного на виході звуку Крім того, нам відомо кількість відліків, що складають один пакет: 384 для Layer 1, 1152 для Layer 2 і Layer 3 Виходячи з цього, можна приблизно обчислити довжину фрейма B відповідності з форматом MPEG заголовки розташовуються на однаковій відстані один від одного

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

Лістинг 149 Пошук чергового заголовка

if (_bitRate == 0) {/ / Нестандартна швидкість передачі бітів

} Else if (_layer == 1) {/ / Для Layer 1 сторінка складається

/ / З чотирьох байт

_headerSpacing = / / Сторінок в пакеті =

384 / / відліку в пакеті

/ 32 / / Бітов в сторінці

* _bitRate / / Бітов за секунду

/ _samplingRate / / Відлік за секунду

_header + = _headerSpacing * 4 / / 4 байта на сторінку

if (_padding) _header + = 4 / / Додаткова сторінка

} Else {/ / Для Layer 2 і Layer 3 сторінка дорівнює одному байту

_headerSpacing =

1152

//

Відліків в пакеті

/ 8

//

Бітов в сторінці

* _bitRate

//

Бітов за секунду

/ _samplingRate

//

Відліків за секунду

_header += _headerSpacing

//

1 байт на сторінку

if(_padding) _header += 1

//

Додаткова сторінка

}

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

Ще один спосіб, що дозволяє використовувати нестандартну швидкість передачі бітів, полягає в застосуванні особливого коду, відповідного довільної швидкості передачі бітівB цьому випадку безпосередньо обчислити довжину фрейма буде, безумовно, неможливо Тому стандарт передбачає, що при застосуванні довільної швидкості передачі бітів довжина фрейма не повинна змінюватися (за винятком зазначених сторінок, заповнених незначущий інформацією) Завдяки цьому, ми можемо виміряти довжину першого фрейма, просто провівши пошук найближчого попереднього заголовка, після чого використовувати отримане значення для решти фреймів Для запису кількості сторінок у фреймі я застосовував змінну _headerSpacing

Лістинг 1410 Пошук наступного заголовка,

в якому вказана довільна швидкість передачі бітів

if (_headerSpacing) {/ / Відстань між заголовками

/ / Вже відомо

if (_layer == 1) {/ / Для Layer 1 сторінка містить 4 байта

_header += _headerSpacing * 4

if(_padding) _header += 4

} Else {/ / Для Layer 2 і Layer 3 сторінка

/ / Містить 1 байт

_header += _headerSpacing

if(_padding) _header += 1

}

} Else {/ / Потрібно шукати наступний заголовок

int slotLength = (_layer == 1)4:1

_headerSpacing = 1

_header+=slotLength

while((_header[0] = 0xFF) || ((_header[1]&amp0xF0) = 0xF0) ) {

_header+ = slotLength

_headerSpacing++

}

if (_padding) _headerSpacing–

}

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

Лістинг 1411 Читання і декомпресія чергового фрейма MPEG

/ / Читання і декомпресія чергового фрейма

void DecompressMpeg::NextFrame() {

if (ParseHeader ()) {/ / Більше немає заголовків

_samplesRemaining = 0

return

}

/ / Ініціалізація для декодування

_pcmSamples[0] = _sampleStorage[0]

_pcmSamples[1] = _sampleStorage[1]

switch(_layer) {

case 1: LayerlDecode() break case 2: Layer2Decode() break case 3: Layer3Decode() break

}

/ / Ініціалізація для читання вибірок

_pcmSamples[0] = _sampleStorage[0]

_pcmSamples[1] = _sampleStorage[1]

}

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

*

*