0

Структура WAVE файла

Разрабатываю одно устройство на МК, и оно будет воспроизводить звук с флешки. Проще всего воспроизвести WAVE файлы, поэтому использоваться будут именно они. Конечно в интернете есть готовые библиотеки для AVR, но я люблю изучать все сам, проще искать ошибки потом. Поэтому эта статья больше для меня, чтобы собрать воедино найденную информацию.

Итак, WAVE является подвидом RIFF (Resource Interchange File Format — Формат Файла обмена данными), основной концепцией которого является chunk (кусок). Он мне напомнил чем-то структуры в языке Си. Я бы представил chunk примерно следующим видом (по аналогии с каким-нибудь языком программирования):

chunk {Размер, параметры}
или
chunk {Размер, chunk {Размер, параметры} }
и подобные.

Ну а теперь подробнее и с примерами.
WAVE файл мы может открыть с помощью любого HEX редактора. В интернете есть много информации по заголовкам RIFF файлов, и практически везде написано что заголовок состоит из 44 байт, я пользовался этой статьей. Дальше я покажу что это не всегда так. Опишу такой заголовок.

Первые четыре байта 0-3 (chunkId, обозначены зеленым) — название (сигнатура) основного куска "RIFF". Все сигнатуры написаны в кодировке ANSII. Следующие 4 байта 4-7 (chunkSize, обозначены красным) — размер куска без названия и текущих четырех байтов. Все размеры написаны в обратном порядке, то есть написано 1a ab 0a 00, а закодировано AAB1Ah. Как видно, размер куска на 8 байт меньше размера файла (написан внизу, AAB1Ah+8=AAB22h), то есть все остальные куски находятся внутри основного куска RIFF. Четыре байта 8-11 задают формат RIFF-файла (format, обозначены синим). В нашем случае там "WAVE" в ANSII.

Четыре байта 12-15 (subchunk1Id, обозначены желтым) — название нового куска "fmt", размер которого задают следующие четыре байта 16-19 (subchunk1Size, обозначены фиолетовым). В нашем случае там записано число 10h=16. Байты 20,21 (audioFormat, обозначены черным) задают аудиоформат. Если там число, отличное от единицы, значит есть сжатие. Байты 22,23 (numChannels, голубой) — количество каналов, 1-моно, 2- стерео.
Байты 24-27 (sampleRate, оранжевый) — частота дискретизации, у нас AC44h=44100. Байты 28-31 (byteRate, темно-зеленый) — количество байт, переданных за секунду воспроизведения, 2B110h=176400. Байты 32,33 (blockAlign, серый) — Количество байт для одного сэмпла, включая все каналы. Байты 34,35 (bitsPerSample, темно-синий) — количество бит в сэмпле, "глубина" или точность звучания. У нас 10h=16.

Четыре байта 36-39 (subchunk2Id, коричневый) — название следующего куска "data", размер которого задают следующие четыре байта 40-43 (subchunk2Size, красный). Байты с 44 и дальше — как раз наши звуковые данные. О них чуть позже.

Если посчитать количество байт до звуковых данных и сложить их с количеством звуковых, можно заметить, что не хватает примерно 250 байт до размера файла. В них хранятся дополнительные данные, которые не важны при воспроизведении. Например, список авторов, кто создал файл, когда создал, жанр и тому подобное. Самое интересное, что разные программы располагают эти данные в разных местах, Audacity их располагает после куска "data", Freemake Audio Converter их располагает до куска "data". В связи с этим в интернете очень много вопросов, почему заголовок RIFF не 44 байта а больше. Вот вам и ответ.

Писать об этих данных много смысла нет, все можно найти тут. Да и построение у них точно такое же как и у обычных кусков. Просто для примера покажу их в WAVE файлах.

Теперь о звуковых данных. Если у нас моно с 8-битной глубиной звука то тут все просто, каждый байт отвечает за свой сэмпл. Моно 16 бит — каждые два байта — сэмпл. А вот если у нас стерео, то семплы чередуются, левый-правый-левый-правый и так далее.

Подводя итог, для воспроизведения нам необходимо следующее: открыть файл, найти "fmt", посмотреть частоту дискретизации и глубину звука, найти "data", посмотреть сколько байт в куске и считывать семплы. А дальше уже выводим на динамик через R2R матрицу или ШИМ.

Надеюсь что кому-нибудь еще статья будет полезна.

пожаловаться
Другие статьи автора
Комментарии
Самые активные
наверх