案例
分析一个wav文件的头部信息,处理音频数据。
wav-sound-format[1].gif
Paste_Image.png
在Python3中,
/除法,计算结果是浮点数,即使是两个整数恰好整除,结果也是浮点数;
//除法,称为地板除,两个整数的除法仍然是整数; e.g.: a //= 2
总结
(1)wav头部信息长度44字节,含有声道数,采样频率,编码宽度
(2)文件操作
info = f.read(44) # 只读头44个字节头部信息
f.seek(0, 2) # 将文件指针指向文件末尾方便计算文件的长度
f.tell() # 当前文件的位置
f.readinto(buf) # 将data读入到buf中,保存的是活生生的二进制的机器码
f.write # 写文件
buf.tofile(f) # 将buf中的二进制机器码写入到文件中
(3)array和list
代码
import struct
import array
with open('demo.wav', 'rb') as f:
info = f.read(44)
# print(info[22:24]) # b'\x01\x00'
v3 = struct.unpack('h', info[22:24]) # 音频文件的声道数
v4 = struct.unpack('i', info[24:28]) # 音频文件的采用频率)
v5 = struct.unpack('h', info[34:36]) # 音频文件的编码宽度
# print(v3, v4, v5, sep="\n---\n")
f.seek(0, 2) # 文件指针指向文件末尾
index = f.tell() # 21740
n = (f.tell() - 44) // 2 # wav音频文件44位往后才是音频的data部分
buf = array.array('h', (0 for _ in range(n))) # 初始化为0
f.seek(44) # 文件指针指向data开始的位置
res = f.readinto(buf) # 将data读入array中
for i in range(n):
buf[i] //= 4
with open('demo2.wav', 'wb') as f2:
f2.write(info)
buf.tofile(f2)
v = struct.unpack('h', b'\x01\x02') # 513
v2 = struct.unpack('>h', b'\x01\x02') # 258
# print(v)