Чанк формат (Format Chunk)
Чанк Формат («fmt») описує фундаментальні параметри даних, частоту вибірки, розрядність даних і число каналів цифрового звукозапису.
ID = array[1..4] of Char;
ChankFormat = Record
chunkID : ID;
chunkSize : Integer;
wFormatTag : SmallInt;
wChannels : Word;
dwSamplesPerSec : Cardinal;
dwAvgBytesPerSec : Cardinal;
wBlockAlign : Word;
wBitsPerSample : Word;
end;
ChankFormat – може мати і додаткові поля, тому не можна ігнорувати поле chunkSize – що визначає розмір запису мінус 8 битий (поля chunkID і chunkSize).
Значення chunkedID завжди рівне “fmt “. Звукові дані можуть зберігається без стиснення, тоді вибірки зберігаються як було описано в розділі Елементи вибірок і фрейми. У разі формату із стисненням розміри вибірок можуть відрізнятися від розрядності звукових даних. На наявність стиснення указує поле wFormatTag. В цьому випадку його значення wFormatTag відрізняється від одиниці. Крім того в ChankFormat з'являться декілька полий ті, що ідентифікують метод стиснення.
- Перше додаткове поле (типа Word) визначає довжину додаткового блоку(після цього поля).
-Далі слідує спеціальний чанк (Fact chunk) що містить змінну типа Cardinal, що визначає розмір всіх аудіо даних (у нестислому ввиде). Розмір задається у вибірках.
Якщо ніяке стиснення не використовується (тобто, wFormatTag = 1), то після ChankFormat немає додаткових службових полів.
Поле wChannels містить число звукових каналів. Значення 1 указує на моно звучання, значення 2 стерео,4 чотири канали звуку і т.д. Реальні дані зберігаються в чанке даних (Data Chunk), який буде описаний пізнішим.
-У полі dwSamplesPerSec записана частота дискретизації, тобто зберігається частота вибірок в секунду (тобто, Герц). Існують три стандарти MPC - 11025, 22050, і 44100 ГЦ, хоча допускається використання інших частот.
- Поле dwAvgBytesPerSec указує, скільки байтів програються кожну секунду. dwAvgBytesPerSec може використовуватися додатком для оцінки розміру буфера, необхідного для розміщення звукових даних, щоб належним чином відтворювати звук без проблем пов'язаних з перериванням відтворення звуку. Його значення повинне бути рівне результату твору dwSamplesPerSec * wBlockAlign закругленого у велику сторону. Для монофонічного сигналу з дискретністю 8 битий чисельне значення швидкості співпадає із значенням частоти дискретизації. Для стереофонічного сигналу з дискретністю 8 битий вона в два рази вище. Точне значення можна підрахувати по формулі:
nAvgBytesPerSec = (nChannels * nSamplesPerSec * wBitsPerSample) / 8
- У полі wBlockAlign знаходиться вирівнювання блоку в байтах, яке підраховується по формулі: wChannels * (wBitsPerSample div 8) закругленому у велику сторону. По суті, wBlockAlign - розмір фреймів в байтів. (т.о. фрейм для 16-бітової вибірки рівний 2 байтом, фрейм для 16-бітової стерео вибірки 4 байти. І т.д).
У кожному звуковому файлі може бути не більш за один чанка формат.
Чанк даних (Data Chunk)
Чанк даних містить фрейми звукових даних (всі канали звукових даних).Рассмотрим структуру
DataChunk = Record
chunkID : ID;
chunkSize : Integer;
waveformData : array of byte;
end;
-Значення ID завжди рівне ‘data’.
- chunkSize - число байтів в чанке мінус 8 байт (поля ID і chunkSize) крім того, не враховуються байти вирівнювання структури. Пам'ятаєте, що опис даних зберігається в чанке формату. Все вищеперелічене відноситься тільки до нестислого формату.
-Масив waveformData містить власне вибірки, порядок їх проходження і вирівнювання описано в розділі вибірки і фрейми. Число фреймів можна обчислити, розділивши значення chunkSize на wBlockAlign чанка формату.
Чанк даних є необхідною частиною будь-якого звукового файлу. У одному файлі може бути присутнім тільки один чанк даних.