首先
这个图只想说明:前面44个字节都是各种参数。真正的data在后面。
代码
C:\Users\Administrator\desktop> python2
Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec 5 2015, 20:40:30)
>>> f = open('test.wav', 'rb') # 以二进制只读打开
>>> info = f.read(44) # 感受一下读取前44位
>>> info
'RIFF4\xacJ\x02WAVEfmt \x10\x00\x00\x00\x01\x00\x02\x00D\xac\x00\
x00\x10\xb1\x02\x00\x00\x10\x00data\x10\xacJ\x02'
>>> import struct # 这个是用来解码的,有h \ >h \ i 等各种方式,小白表示这个坑——深
>>> struct.unpack('h', info[22:24]) # 22到24对应2个字节,用 h 解码
(2,)
>>> struct.unpack('i', info[24:28]) # 24到28对应2个字节,用 i 解码
(44100,)
>>> import array
# 这个包在这里是用来创建一个数组,感觉像是照二进制的各种格式,比如h啊,i啊来挖坑
>>> f.seek(0, 2) # 指针到最末,计算长度
>>> f.tell() # 总长度结果
38448188L
>>> n = (f.tell() - 44) / 2 # 按照data的长度来挖坑,而data的长度等于总长度减去44
>>> buf = array.array('h', (0 for _ in range(n))) # 挖坑了,以0来占位的意思(吧)
>>> f.seek(44) # 调整指针,从45位开始读取
>>> f.readinto(buf) # 读取后写入
38448144
>>> buf[5] # 开始好长一串都是0
0
>>> buf[50050]
15701
>>> for i in range(n): buf[i] /=8 # 把data里面的每一对数据都除8,效果等于声音减小
...
>>> f2 = open('test2.wav', 'wb') # 开始写入
>>> f2.write(info) # 前44个套路写入
>>> buf.tofile(f2) # 后面data写入
>>> f2.close()
>>>
结果
对比两个wav文件真的声音大小差了很多,顿时觉得很神奇。
说明:此教程来自于慕课网刘硕老师的“Python进阶强化训练”,这里粘贴如果有侵权请告知删帖。刘硕老师是很好的老师!