加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 解析WAV文件头

发布时间:2020-12-20 12:26:22 所属栏目:Python 来源:网络整理
导读:我正在编写一个程序来解析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
我正在编写一个程序来解析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........|

>之间的部分和<在两个文件中都是采样率. “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文件格式的信息:

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

解决方法

“40 1F 00 00”字节等于一个十六进制值为00001F40的整数(请记住整数以小端格式存储在WAVE文件中).十六进制的值00001F40等于十进制值8000.

类似地,“44 AC 00 00”字节等于其十六进制值为0000AC44的整数.十六进制值0000AC44等于十进制值44100.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读