
Структура файла
Wav файл представляет собой набор из многочисленных чанков разного типа. Важнейшим чанком является чанк формата (Format chunk – «fmt»), который содержит важные параметры звуковых данных, например частоту выборки. Другим важным чанком является чанк данных (Data chunk), который и определяет форму аудио сигнала. Присутствие других дополнительных чанков (optional chunks) не обязательно.
Все приложения использующие wav файлы должны уметь читать обязательные чанки, и уметь выборочно игнорировать дополнительные чанки. Программы, предназначенные для копирования wav файлов должны копировать все чанки, даже те которые он не может интерпретировать. Порядок следования чанков разного типа может быть произвольным. Исключение составляет чанк формата, который должен предшествовать чанку данных.
Рассмотрим схему простейшего wav файла
__________________________
| RIFF WAVE Chunk |
| groupID = 'RIFF' |
| FileSize : Cardinal; |
| riffType = 'WAVE' |
| __________________ |
| | Format Chunk | |
| | ckID = 'fmt ' | |
| |__________________| |
| __________________ |
| | Sound Data Chunk | |
| | ckID = 'data' | |
| |__________________| |
|__________________________|
Чанк формат (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 байта. И т.д).
В каждом звуковом файле может быть не более одного чанка формата.