Программирование - вопрос/ответ



         

Программирование - часть 29


--------Sample1------- --------Sample2-------

Channel0 Channel1 Channel0 Channel1
16 bit mono:

--------Sample1------- --------Sample2-------

Channel0 Channel0 Channel0 Channel0
(low byte) (high byte) (low byte) (high byte)
16 bit stereo:

-------------------Sample1---------------------

Channel0 Channel0 Channel1 Channel1
(low byte) (high byte) (low byte) (high byte)
Средние и крайние значения элемента дискретизации вычисляются так:
Разрядность Формат данных

------------------------------

1-8 bit unsigned char
8-16 bit int
например,
Формат Max Min Midpoint

---------------------------------------

8 bit PCM 255 0 128
16 bit PCM 32767 -32768 0

Для примера разберем начало простенького PCM WAVE файла по байтам. Все смещения (слева) и размеры полей (справа в квадратных скобках ) приведены в hex виде.

— Начало RIFF-чанка
00 'RIFF' [4]
04 DWORD — размер RIFF-чанка [4]
— Начало WAVE-формы
08 'WAVE' [4]
— Начало fmt-чанка
0C 'fmt ' [4]
10 DWORD — размер fmt-чанка (10h или 12h) [4]
— Структура WaveFormat (или WaveFormatEx)
14 WORD wFormatTag = 1 (это же PCM) [2]
16 WORD nChannels = 1 [2]
18 DWORD nSamplesPerSec = 11025 [4]
1C DWORD nAvgBytesPerSec = 11025 [4]
20 WORD nBlockAlign = 1 [2]
22 WORD nBitsPerSample = 8 [2]
24 WORD cbSize (=0 или отсутствует для PCM. [2]
Далее в круглых скобках приведены смещения для случая без cbSize)
— Конец fmt-чанка

— Начало data-чанка
26 (24) 'data' [4]
2A (28) DWORD размер data-чанка [4]
2E (2C) Sample0,Sample1,Sample2,… [???]
— Конец WAVE-формы
— Конец RIFF-чанка

Работать с таким файлом можно по следующей грубой схеме:

1. Проверяем сигнатуру 'RIFF' по смещению 0
2. Проверяем сигнатуру 'WAVE' по смещению 8
3. Проверяем wFormatTag=1 по смещению 14
4. Читаем nChannels,nBitsPerSample по смещениям 16 и 22
5. Если надо, читаем nSamplesPerSec по смещению 18
6. Начиная со смещения 24, начинаем искать data-чанк. Этого можно было бы и не делать, а сразу читать сигнал по смещению 2E(2C), но я встречал wave файлы, у которых после fmt-чанка вставлен некий fact-чанк длины 4 (+4 на сигнатуру +4 на ckSize), о назначении коего мне, к сожалению, ничего не известно.


Содержание  Назад  Вперед