Среда, 04.12.2024, 11:44

  Сайт проекта StreamLive 3.145.95.184

Вы вошли как Гость | Группа "Гости" | RSS

Меню

Категории
Разное [2]
Статьи [0]
1C [1]
Статьи по 1С

Реклама

Nothing

 
Главная » Статьи » Полезное » Разное [ Добавить статью ]
Формат WAVE файлов

Формат WAVE файлов

WAVE – это формат хранения оцифрованных аудио данных. Данный формат поддерживает данные различной битности, с различной частотой выборки и числом каналов. Данный формат весьма популярен на платформах стандарта IBM PC (и совместимых с ним).

Этот формат подразумевает хранение аудио данных в особых блоках, которые называют чанками (chunks).
Форматы данных

ID = array[1..4] of Char; - идентификатор чанка.
Организация данных

Все данные хранятся в виде 8-ми битовых чисел, расположенных таким образом, что младшая часть слова данных записывается первой.

Byte : | байт 0 |.

Word : | байт 0 | байт 1 |

Integer : | байт 0 | байт 1 | байт 2 | | байт 3 |
Структура файла

Wav файл представляет собой набор из многочисленных чанков разного типа. Важнейшим чанком является чанк формата (Format chunk – «fmt»), который содержит важные параметры звуковых данных, например частоту выборки. Другим важным чанком является чанк данных (Data chunk), который и определяет форму аудио сигнала. Присутствие других дополнительных чанков (optional chunks) не обязательно.

Все приложения использующие wav файлы должны уметь читать обязательные чанки, и уметь выборочно игнорировать дополнительные чанки. Программы, предназначенные для копирования wav файлов должны копировать все чанки, даже те которые он не может интерпретировать. Порядок следования чанков разного типа может быть произвольным. Исключение составляет чанк формата, который должен предшествовать чанку данных. Некоторые грубо написанные программы всегда интерпретируют первый чанк (после RIFF заголовка) как чанк формата, хотя в спецификации формата подразумевается, что первый чанк может быть не только чанком формата, но и дополнительным чанком.

Рассмотрим схему простейшего wav файла
__________________________
| RIFF WAVE Chunk |
| groupID = 'RIFF' |
| FileSize : Cardinal; |
| riffType = 'WAVE' |
| __________________ |
| | Format Chunk | |
| | ckID = 'fmt ' | |
| |__________________| |
| __________________ |
| | Sound Data Chunk | |
| | ckID = 'data' | |
| |__________________| |
|__________________________|

Формат wav файла создавался и модифицировался без всякой координации множеством авторов (каждый из которых вносил свои специфические чанки). В результате он получился отчасти противоречивым, например 8-ми битные данные являются беззнаковыми, а 16-битные – числа со знаком.
Элементы выборок и фреймы

Важнейшими понятиями при интерпретация wave файлов, являются понятия элементы выборок и фреймы. Элемент выборки представляет собой мгновенное значение амплитуды сигнала. Данные длинной более 8-ми бит хранятся в виде блока размером от 9 до 32 бит состоящего из двух смежных слов (определяется значением поля wBitsPerSample, в чанке формата, для несжатого подстандарта PCM). Например для 16 битного формата (2х8 бит) диапазон значений амплитуд от -32768 ($8000) до 32767 ($7FFF). Для формата 8бит и меньше (1 беззнаковый байт) диапазон значений амплитуд от 0 до 255.

В связи с архитектурой современных процессоров было решено, что при сохранении данных размер выборки будет округлятся до величины кратной 8-битам. Для АЦП с разрядностью не более 8-бит данные сохраняются в 8-ми битном формате. Для АЦП с разрядностью от 9 до 16 бит элемент выборки будет 16 битным числом со знаком.

Для АЦП с разрядностью от 17 до 24 бит выборка будет 3-х байтной. Для АЦП с разрядностью от 25 до32 бит выборка будет двойным знаковым 32 битным словом. И т.д.

Кроме того, биты данных (не кратных 8) должны быть выровнены по левому краю. Например 12 битные данные (записываются 16-ти битным словом) выравниваются следующим образом – данные выборки записываются с 4-го по 15 бит включительно, биты от 0 до 3 устанавливаются в нуль. Т.о. число 101000010111 записывается как
___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
| | | | | | | | | | | | | | | | |
| 1 0 1 0 0 0 0 1 0 1 1 1 0 0 0 0 |
|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|
<---------------------------------------------> <------------->
12 битная выборка выровненная по левому краю крайне правые
Байты установленные
в нуль.

Но в файл данные будут записаны так
___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
| | | | | | | | | | | | | | | | | |
| 0 1 1 1 0 0 0 0 | | 1 0 1 0 0 0 0 1 |
|___|___|___|___|___|___|___|___| |___|___|___|___|___|___|___|___|
<-------------> <-------------> <----------------------------->
биты 0 до 3 4 нулевых биты от 4 до 11

При многоканальной записи элементы выборок записываются поочередно. Так для стерео записи в начале пишется одна выборка левого канала, затем правого, затем следующая выборка левого и т.д. Такое расположение выборок упрощает пересылку данных в ЦАП. Блок из нескольких выборок воспроизводимых одновременно называется фреймом. В нашем примере фрейм это блок, состоящий из двух выборок (левого и правого каналов)

фрейм 0 фрейм 1 фрейм N
_____ _____ _____ _____ _____ _____
| ch1 | ch2 | ch1 | ch2 | . . . | ch1 | ch2 |
|_____|_____|_____|_____| |_____|_____|
_____
| | = одна выборка
|_____|

Для одноканальной записи, фрейм состоит просто из одной выборки. Для многоканальной записи правила составления фрейма следующие:


channels 1 2
_________ _________
| left | right |
stereo | | |
|_________|_________|


1 2 3
_________ _________ _________
| left | right | center |
3 channel | | | |
|_________|_________|_________|

1 2 3 4
_________ _________ _________ _________
| front | front | rear | rear |
quad | left | right | left | right |
|_________|_________|_________|_________|

1 2 3 4
_________ _________ _________ _________
| left | center | right | surround|
4 channel | | | | |
|_________|_________|_________|_________|

1 2 3 4 5 6
_________ _________ _________ _________ _________ _________
| left | left | center | right | right |surround |
6 channel | center | | | center | | |

|__________|_________|__________|__________|__________|_________|

Выборки в пределах одного фрейма записываются непрерывно один за другим без неиспользованных байтов между ними. Следует отметить, что все вышеупомянутое относится к формату записи без сжатия (PCM).


Чанк формат (Format Chunk)

Чанк Формат («fmt») описывает фундаментальные параметры данных, частоту выборки, разрядность данных и число каналов цифровой звукозаписи.


ChankFormat – может иметь и дополнительные поля, поэтому нельзя игнорировать поле

chunkSize – определяющее размер записи минус 8 бит (поля chunkID и chunkSize),.

Значение chunkedID всегда равно “fmt “. Звуковые данные могут хранится без сжатия, тогда выборки хранятся как было описано в разделе Элементы выборок и фреймы. В случае формата со сжатием размеры выборок могут отличаться от разрядности звуковых данных. На наличие сжатия указывает поле wFormatTag. В этом случае его значение wFormatTag отличается от единицы. Кроме того в ChankFormat появятся несколько полей идентифицирующие метод сжатия.

- Первое дополнительное поле (типа Word) определяет длину добавочного блока(после этого поля).

-Далее следует специальный чанк (Fact chunk) содержащий переменную типа Cardinal, определяющую размер всех аудио данных (в несжатом ввиде). Размер задается в выборках. Существует большое количество методов сжатия. Детальное описание каждого из них можно посмотреть на сайте Microsoft.

Если никакое сжатие не используется (то есть, wFormatTag = 1), то после ChankFormat нет дополнительных служебных полей.

Поле wChannels содержит число звуковых каналов. Значение 1 указывает на моно звучание, значение 2 стерео ,4 четыре канала звука и т.д. Напомню, что выборки многоканальных записей чередуются, а элементарный блок из таких данных образуют Фрейм. Реальные данные хранятся в чанке данных (Data Chunk), который будет описан позже.

-Поле dwSamplesPerSec хранит частоту выборок в секунду (то есть, Герц). Существуют три стандарта MPC - 11025, 22050, и 44100 ГЦ, хотя допускается использование других частот.

- Поле dwAvgBytesPerSec указывает, сколько байтов проигрываются каждую секунду. dwAvgBytesPerSec может использоваться приложением, чтобы оценить, буфер какого размера необходим, для того чтобы должным образом воспроизводить звук без проблем связанных с прерыванием воспроизведения звука. Его значение должно быть равно результату произведения dwSamplesPerSec * wBlockAlign округленного в большую сторону.

- Поле wBlockAlign должно быть равно значению выражения

wChannels * (wBitsPerSample div 8) округленному в большую сторону. По существу, wBlockAlign - размер фреймов в байтов. (т.о. фрейм для 16-битовой выборки равен 2 байтом, фрейм для 16-битовой стерео выборки 4 байта. И т.д).

В каждом звуковом файле может быть не более одного чанка формата.


Чанк данных (Data Chunk)

Чанк данных содержит фреймы звуковых данных (все каналы звуковых данных)

Рассмотрим структуру


-Значение ID всегда равно ‘data’.

- chunkSize - число байтов в чанке минус 8 байт (поля ID и chunkSize) кроме того, не учитываются байты выравнивания структуры. Помните, что описание данных хранится в чанке формата. Все вышеперечисленное относится только к несжатому формату.

-Массив waveformData содержит собственно выборки, порядок их следования и выравнивание описано в разделе выборки и фреймы. Число фреймов можно вычислить, разделив значение chunkSize на wBlockAlign чанка формата.

Чанк данных является необходимой частью любого звукового файла. В одном файле может присутствовать только один чанк данных.

В заключение хочется напомнить, что существуют множество других чанков таких как например Cue Chunk(вроде описания данного аудио файла), Playlist chunk, Associated Data List, Label Chunk, Note Chunk, Labeled Text Chunk, Sampler Chunk, Instrument Chunk Format. Для воспроизведения аудио их надо просто игнорировать.

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


Пример чтения wav

Продолжение чтение wav файлов (мой пример).........

А теперь попробуем правельно прочитать прочитать wav файл как этого требует формат.



Источник:
Категория: Разное | Добавил: Sumrak (14.11.2010) | Автор: E W
Просмотров: 3548 | Комментарии: 0 | Теги: | Рейтинг: 0.0/0
Всего комментариев: 0

Log in

Block title

Copyright sumrak © 2024