Python0019 音频处理(二).wav文件
上一篇文章中写到使用python 提供的wave模块对.wav文件进行读写,感觉借用别人写的代码读.wav文件不够牛B。自然而然对.wav文件产生了浓厚的兴趣。经过昨天的努力,对该格式的文件已经略有了解,并且用java实现了对.wav读取。这篇文章打算换成认识这篇文章的过程。而不是一开始介绍一堆概念,然后摆上代码。按照认识过程来写读起来比较容易理解。
1.什么是.wav文件
这是一种音频文件,取一个.wav文件,然后读取文件二进制数据,并输出。再用python的wave模块读取音频数据,输出来。然后对比文件的属性,发现一些规律。
(1)找一个.wav文件,用下面代码处理:
import wave
f="./sound11.wav"
w=wave.open(f, "r")
dt=w.readframes(20)
print(dt)
w.close()
b=open(f,'rb')
for _ in range(10):
print(b.read(40))
b.close()
b"\x9b\xfd\x0e\xfcu\xffe\xfc+\xff\n\xfd\xec\xffG\xfe\xe7\x00\xb6\xfe\xe7\x00\xfd\xfd\x14\x01A\xfe\x8c\xff\xe3\xfe\xc4\xfe\x8d\xffP\xff\xea\xff\xcd\xfe\x0e\x00F\xff\xcb\x00$\xff)\xff\xcf\xfdk\xfd\xa2\xfe\r\xfd\xff\xfe\xe0\xfc{\xfe'\xfd\x18\xff\xdb\xfd:\xff\x1f\xfeq\xfe\xe0\xfc"
b'RIFFF\xe2\x04\x00WAVEfmt \x10\x00\x00\x00\x01\x00\x02\x00@\x1f\x00\x00\x00}\x00\x00\x04\x00\x10\x00LIST'
b'\x1a\x00\x00\x00INFOISFT\x0e\x00\x00\x00Lavf58.10.100\x00data\x00\xe2\x04\x00\x9b\xfd'
b'\x0e\xfcu\xffe\xfc+\xff\n\xfd\xec\xffG\xfe\xe7\x00\xb6\xfe\xe7\x00\xfd\xfd\x14\x01A\xfe\x8c\xff\xe3\xfe\xc4\xfe\x8d\xffP\xff\xea\xff\xcd\xfe'
b"\x0e\x00F\xff\xcb\x00$\xff)\xff\xcf\xfdk\xfd\xa2\xfe\r\xfd\xff\xfe\xe0\xfc{\xfe'\xfd\x18\xff\xdb\xfd:\xff\x1f\xfeq\xfe\xe0\xfc\xc1\xfe"
b'\xe0\xfb\x85\xfe\xf3\xfc\x80\xfeg\xfd\xb8\xfd\xd2\xfb\x04\xfd\xd3\xfb\xc6\xfd_\xfc\x07\xfe\xeb\xfb\xc2\xfd\x11\xfc\x94\xfe\xaf\xfc\xde\xfe\x14\xfd6\xff'
b'N\xfdu\x00\x9f\xfd\xbb\x00\xef\xfdY\x01\xa5\xfeH\x00\x02\xfea\xfe\xe9\xfd\xcb\xfd\x9a\xfd\xfa\xfd\x12\xfd\xe0\xfe\xc6\xfdr\xff\xe0\xfe\xef\xfe'
b'\xab\xff6\xfe\xfc\xfe\x15\xff\xb2\xfe^\xff\xd8\xfea\x00\x03\x00\xbe\x00\xb5\x00\x94\x00\xe0\x01\x14\x01\xbc\x01\xc1\x01\x03\x01q\x01\xd1\x01;\x02'
b'\x97\x03$\x02\xb1\x03\xa1\x01\x16\x02\xf6\x01S\x02\xa2\x00\xee\x01j\x00a\x01\x8c\x00\x06\x01\xbe\x00\xbe\x00\xf2\x01p\x01C\x02\x00\x01\t\x02'
b'\xd1\x00\xdd\x01\xf6\x00e\x01m\x01-\x00\xb9\x00\xfd\xff\x10\x01\xbf\xff\xc1\x01\xa7\xfeJ\x00\\\xfe\x06\x00\t\xff\xd7\xff\xfe\xfe\xe0\xfe\r\x00'
b'\xe0\xfeQ\x01\x14\x00\x8c\x00\n\x00\xf8\xff\x08\xffV\x00\xcb\xff\xd9\xff\xa6\x00|\xff\x10\x02\xce\xff\xb9\x02A\xff\xd9\x01\x8a\xffz\x00\xf1\xff'
初步结论:.wave是一种没有经过压缩的音频文件。 .wave 文件的前78字节记录了音频的相关信息。
(2)接下来就是对文件头部前78B进行研究了。
头部数据:
RIFFF\xe2\x04\x00WAVEfmt \x10\x00\x00\x00\x01\x00\x02\x00@\x1f\x00\x00\x00}\x00\x00\x04\x00\x10\x00LIST
\x1a\x00\x00\x00INFOISFT\x0e\x00\x00\x00Lavf58.10.100\x00data\x00\xe2\x04\x00\
可以看到存在一些可以看懂的疑似固定字母的数据,这些应该是该文件头部固定的信息。例如RIFF,WACE,fmt_,[LIST],[INFOISFT],data。然后去网上找了一些关于.wava头部信息,如下:
[4B]固定字符串'RIFF' [4B]整数,代表剩余文件长度 [4B]固定字符串'WAVE' [4B]固定字符串'fmt '(后面有一个空格)
[4B]整数,代表接下来几个音频文件参数的长度 [2B]整数,audio_format_tag [2B]整数,声道个数 [4B]整数,采样率
[4B]整数,音频数据传送速率AvgBytesPerSec [2B]整数,BlockAlign 数据块调整数 [2B]整数,采样大小bitsPerSample
#下面这部分可能有,也可能没有,记录一些没有用的信息。
[4B]固定字符串'LIST' [4B]整数,代表剩余的这些没用信息的总长度s [sB]没什么卵用的信息,可能有作者,公司等信息,直接跳过即可。
[4B]固定字符串'data' [4B]整数,代表接下来音频数据的总长度n [nB]音频数据
(3)按照上面的头信息来解析刚才那个头部
注意:部分二进制数据以字符形式显示,可以对照这里 http://ascii.911cha.com/查找对应的16进制
注意:里面整数是无符号整数,数据方向是由后向前比如F\xe2\x04\x00 代表整数0x0004e266
RIFF F\xe2\x04\x00剩余文件长度是:0x4e266 320102B WAVE
fmt_ \x10\x00\x00\x00接下的数据长度是:0x10 16B \x01\x00audio_famat_tag:0x1 \x02\x00声道数0x2 2个声道
@\x1f\x00\x00采样率0x1f40 8000fps \x00}\x00\x00音频数据传送率0x7d00 32000Bps \x04\x00数据块调整0x4 4Bpf
\x10\x00采样大小0x10 16b=2B
LIST \x1a\x00\x00\x00接下的数据长度是:0x1a 26BINFOISFT \x0e\x00\x00\x00接下的数据长度是:0xe 14B
Lavf 58.10.100 \x00截止
data \x00\xe2\x04\x00\接下的数据长度是:0x4e200 320000B
2.有了上面的知识写一个wave文件的读写类并不困难。
略