案例
分析一個wav文件的頭部信息货徙,處理音頻數(shù)據(jù)左权。
在Python3中,
/
除法痴颊,計算結(jié)果是浮點數(shù)赏迟,即使是兩個整數(shù)恰好整除,結(jié)果也是浮點數(shù)蠢棱;
//
除法锌杀,稱為地板除,兩個整數(shù)的除法仍然是整數(shù)泻仙; e.g.: a //= 2
總結(jié)
(1)wav頭部信息長度44字節(jié)糕再,含有聲道數(shù),采樣頻率饰豺,編碼寬度
(2)文件操作
info = f.read(44) # 只讀頭44個字節(jié)頭部信息
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]) # 音頻文件的聲道數(shù)
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)