wav文件信息格式图
前44字节为头信息,后面的为音频数据。
import struct
import array
# 读取wav文件,二进制要记得用b
file = open('Love Story.wav', 'rb')
# 获取前44个字节,文件信息。
info = file.read(44)
# 获取文件大小, 将指针移动到文件末尾
file_size = file.seek(0, 2)
# 计算数组大小
n = (file_size - 44) // 2
# 生成buf
buf = array.array('h', (0 for _ in range(n)))
# 将文件指针定位到44
file.seek(44)
# 将数据读入到buf中
file.readinto(buf)
# 将声音变小
for i in range(n):
buf[i] //= 10
# 写入数据
f = open('demo.wav', 'wb')
f.write(info)
buf.tofile(f)
# 关闭文件
f.close()
file.close()
print('完成')
二进制数据可以用readinto,读入到提前分配好的buffer中,便于数据处理。
解析二进制数据可以使用标准库中的struct模块的unpack方法
比如:查看声道数
struct.unpack('h', file[22:24])
查看采样频率
struct.unpack('i', file[24:28])