如何處理二進位制檔案?
阿新 • • 發佈:2020-07-13
需求:
wav是一種音訊檔案的格式,音訊檔案為二進位制檔案,wav檔案由頭部資訊和音訊取樣資料組成,前44個位元組為頭部資訊,包括聲道數,取樣頻率,PCM位寬等等,後面是音訊取樣資料。
使用python,分析一個wav檔案頭部資訊,處理音訊資料。
思路:
open函式想以二進位制模式開啟檔案,指定Mode引數為'b'。
二進位制資料可以用readinto,讀入提前分配的buffer中,便於資料處理。
解析二進位制資料可以使用標準庫中的struct模組的unpack方法
程式碼:
import struct import array # 以rb的模式開啟wav檔案 f = open('demo.wav','rb') # 讀取前44個位元組 info = f.read(44) # 將檔案的指標移到檔案的末尾 f.seek(0,2) # 報告檔案的指標 f.tell() # 計算陣列的長度 n = (f.tell() - 44) / 2 # 生成陣列並初始化陣列 buf = array.array('h',( 0 for _ in range(n))) # 將檔案的資料讀入到buf中 # 首先要注意將檔案的指標指向到data的開關 f.seek(44) f.readinto(buf) # 對每一個取樣資料進行除以8的操作,這樣可以使wav檔案的聲音變小一些 for i in range(n): buf[i] /= 8 # 將改變的資料寫入新的檔案中 f2 = open('demo2.wav','wb') # 先寫入檔案資訊頭的部分 f2.write(info) # 將檔案的資料寫入檔案中 buf.tofile(f2) # 關閉檔案 f2.close()