2010-11-17 89 views
2

我正在編寫一個程序來解析WAV文件標題並將信息打印到屏幕上。寫程序之前,我做了一些研究解析WAV文件標題

hexdump都-n 48 sound_file_8000hz.wav

00000000 52 49 46 46 bc af 01 00 57 41 56 45 66 6d 74 20 |RIFF....WAVEfmt | 
00000010 10 00 00 00 01 00 01 00 >40 1f 00 00< 40 1f 00 00 |[email protected]@...| 
00000020 01 00 08 00 64 61 74 61 98 af 01 00 81 80 81 80 |....data........| 

hexdump都-n 48 sound_file_44100hz.wav

00000000 52 49 46 46 c4 ea 1a 00 57 41 56 45 66 6d 74 20 |RIFF....WAVEfmt | 
00000010 10 00 00 00 01 00 02 00 >44 ac 00 00< 10 b1 02 00 |........D.......| 
00000020 04 00 10 00 64 61 74 61 a0 ea 1a 00 00 00 00 00 |....data........| 

之間>並在這兩個文件<的一部分是採樣率。

「40 1f 00 00」如何轉換爲8000Hz,「44 ac 00 00」轉換爲44100Hz?像通道數量和音頻格式等信息可以直接從轉儲中讀取。我發現了一個名爲WavHeader的Python 腳本,它可以在兩個文件中正確解析採樣率。這是腳本的核心:

bufHeader = fileIn.read(38) 
    # Verify that the correct identifiers are present 
    if (bufHeader[0:4] != "RIFF") or \ 
     (bufHeader[12:16] != "fmt "): 
     logging.debug("Input file not a standard WAV file") 
     return 
    # endif 
    stHeaderFields = {'ChunkSize' : 0, 'Format' : '', 
     'Subchunk1Size' : 0, 'AudioFormat' : 0, 
     'NumChannels' : 0, 'SampleRate' : 0, 
     'ByteRate' : 0, 'BlockAlign' : 0, 
     'BitsPerSample' : 0, 'Filename': ''} 
    # Parse fields 
    stHeaderFields['ChunkSize'] = struct.unpack('<L', bufHeader[4:8])[0] 
    stHeaderFields['Format'] = bufHeader[8:12] 
    stHeaderFields['Subchunk1Size'] = struct.unpack('<L', bufHeader[16:20])[0] 
    stHeaderFields['AudioFormat'] = struct.unpack('<H', bufHeader[20:22])[0] 
    stHeaderFields['NumChannels'] = struct.unpack('<H', bufHeader[22:24])[0] 
    stHeaderFields['SampleRate'] = struct.unpack('<L', bufHeader[24:28])[0] 
    stHeaderFields['ByteRate'] = struct.unpack('<L', bufHeader[28:32])[0] 
    stHeaderFields['BlockAlign'] = struct.unpack('<H', bufHeader[32:34])[0] 
    stHeaderFields['BitsPerSample'] = struct.unpack('<H', bufHeader[34:36])[0] 

我不明白這是如何提取相關採樣率,當我不能使用hexdump?

我使用有關該網頁上的WAV文件格式的信息:

https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

+0

爲什麼'wave'模塊對此沒有好處? – 2010-11-17 17:36:57

+0

我不是用Python編寫我的應用程序,我只是想知道爲什麼我無法正確解析採樣率。 – anderson25 2010-11-17 17:40:28

回答

8

的「40 1F 00 00」字節等同於一個整數,其十六進制值是00001F40(記住,整數被存儲在小端排序格式的WAVE文件)。 00001F40的十六進制值等於十進制值8000.

類似地,「44 AC 00 00」字節等於其十六進制值爲0000AC44的整數。 0000AC44的十六進制值等於十進制值44100.

+0

感謝您的解釋。 – anderson25 2010-11-17 20:23:56

5

他們little-endian

>>> 0x00001f40 
8000 
>>> 0x0000ac44 
44100 
+0

這是問題所在。謝謝 – anderson25 2010-11-17 20:23:21