RIFF WAV формат заголовка 2014 обновление?

Я пытаюсь декодировать и воспроизводить WAV-файлы на Perl для дальнейших операций, я нашел некоторые ссылки на формат и некоторые интересные вопросы q+a.

Что содержит аудио кадр? Ошибка чтения WAV-файла с C++. Запись музыкальных заметок в WAV-файл.

Я обнаружил "Канонический формат файла WAVE"

Но в конце я тестирую 2 разных WAV-файла, которые не соответствуют "стандарту". У Mplayer вообще нет проблем с чтением данных, и я нашел обходной путь для своего Perl-кода:

sysread WAV, $riff, 12;
sysread WAV, $fmt,  24;

do{
    sysread WAV, $wtf, 2;

}while( unpack("A4",$wtf) ne "da" );
sysread WAV, $wtf, 2;

#94
sysread WAV, $data,  4;

Тем не менее меня беспокоит, как это на самом деле работает, и что это за переменные данные между полем "бит на выборку" и полем "данные".

Спасибо вам, ребята!

(Я становлюсь зависимым от этого форума)

test2.wav

       v--------- riff --------------v--------- 
0000000 4952 4646 685e 0931 4157 4556 6d66 2074
        -------------- fmt --------------------
0000010 0028 0000 fffe 0006 bb80 0000 ca00 0008
        ---------v-----------------------------
0000020 000c 0010 0016 0010 060f 0000 0001 0000
        ---------------------------------------
0000030 0000 0010 0080 aa00 3800 719b 494c 5453
        ---------------------------------------
0000040 001a 0000 4e49 4f46 5349 5446 000e 0000
        ----------------------------------v----
0000050 614c 6676 3535 312e 2e39 3031 0034 6164
        ----v---------v
0000060 6174 6800 0931 0000 0000 0000 0000 0000
0000070 0000 0000 0000 0000 0000 0000 0000 0000

test.wav

       v--------- riff --------------v--------- 
0000000 4952 4646 7048 095b 4157 4556 6d66 2074
        -------------- fmt --------------------
0000010 0012 0000 0001 0002 ac44 0000 b110 0002
        ---------v-----------------------------
0000020 0004 0010 0000 494c 5453 001a 0000 4e49
        ---------------------------------------
0000030 4f46 5349 5446 000e 0000 614c 6676 3535
        -------------------v---------v---------v
0000040 312e 2e39 3031 0034 6164 6174 7000 095b       
0000050 0000 0000 0000 0000 0000 0000 0000 0000

1 ответ

Решение

AudioFormat поле в test2.wav является 0xfffe который указывает, что это заголовок WAVEFORMATEXTENSIBLE, Когда это происходит, вам нужно по-разному интерпретировать остальную часть заголовка.

AudioFormat   : 2
NumChannels   : 2
SampleRate    : 4
ByteRate      : 4
BlockAlign    : 2
BitsPerSample : 2
cbSize        : 2  - size of the rest of the chunk
ChannelMask   : 4
SubFormat     : 16 - GUID

Для получения дополнительной информации посмотрите некоторые документы на WAVEFORMATEX а также WAVEFORMATEXTENSIBLE

Другие вопросы по тегам