我正在编写一个程序来解析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 |........@...@...|
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........|
&gt;之间的部分和&lt;在两个文件中都是采样率。
“40 1f 00 00”如何转换为8000Hz和“44 ac 00 00”转换为44100Hz?可以直接从转储中读取信道数和音频格式等信息。我发现了一个Python 名为WavHeader的脚本,可在两个文件中正确分析采样率。这是脚本的核心:
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文件格式的信息:
答案 0 :(得分:8)
“40 1F 00 00”字节等于一个十六进制值为00001F40的整数(请记住整数以小端格式存储在WAVE文件中)。十六进制值00001F40等于小数值8000。
类似地,“44 AC 00 00”字节等于其十六进制值为0000AC44的整数。以十六进制表示的值0000AC44等于十进制值44100。
答案 1 :(得分:5)
他们是little-endian。
>>> 0x00001f40
8000
>>> 0x0000ac44
44100