Python如何使用struct.unpack處理二進(jìn)制文件
如何處理二進(jìn)制文件?
實際案例
- wav是一種音頻文件的格式,音頻文件為二進(jìn)制文件。
- wav文件由頭部信息和音頻采樣數(shù)據(jù)構(gòu)成,前44個字節(jié)為頭部信息,包含聲道數(shù)、采樣頻率、PCM位寬等等,后面是音頻采樣數(shù)據(jù)。
- 使用python分析一個wav文件頭部信息,處理音頻數(shù)據(jù)。
WAV格式如下:
簡單分為兩部分,第一部分前44個字節(jié)是音頻文件的一些信息,第二部分44個字節(jié)后面是音頻文件的采樣數(shù)據(jù)。
解決方案
- open函數(shù)想以二進(jìn)制模式打開文件,指定mode參數(shù)為'b'。
- 二進(jìn)制數(shù)據(jù)可以用fromfile(Python2中可以使用readinto),讀入到提前分配好的buffer中,便于數(shù)據(jù)處理。
- 解析二進(jìn)制數(shù)據(jù)可以使用標(biāo)準(zhǔn)庫中的struct模塊的unpack方法。
代碼演示
(1)struct.unpack方法簡單使用
# 以二進(jìn)制形式打開文件 f = open('微信語音視頻.wav', 'rb') # 讀取前44字節(jié) info = f.read(44) print(info) import struct ''' struct.unpack方法介紹: unpack(format, buffer) format:解析類型 buffer:需要解析二進(jìn)制串 例: 構(gòu)造兩個字節(jié)的二進(jìn)制串,format默認(rèn)為小端字節(jié)順序, h為16為,結(jié)果:2*256+1=513 struct.unpack('h', b'\x01\x02') 指定format為大端字節(jié)順序,結(jié)果:256+2=258 struct.unpack('>h', b'\x01\x02') ''' # print(help(struct.unpack)) # 解析聲道數(shù),Num Channels為22到24字節(jié) print(struct.unpack('h', info[22:24])) # 解析采樣頻率,SampleRate為24到28字節(jié),i為int類型 print(struct.unpack('i', info[24:28])) # 編碼寬度,BitsPerSample為34到36字節(jié) print(struct.unpack('h', info[34:36]))
(2)實現(xiàn)二進(jìn)制文件wav的處理
# _*_ encoding:utf-8 _*_ import array ''' 讀取data數(shù)據(jù)部分不希望是字符串形式,因為字符串不支持?jǐn)?shù)學(xué)運(yùn)算, 對它不方便數(shù)據(jù)處理,最好讀取到類似于C語言中數(shù)組中去 ''' # 修改文件指針移動到文件末尾 f.seek(0, 2) # 報告文件指針,也就是文件大小 print(f.tell()) # 數(shù)組的長度為文件字節(jié)長度減去44個字節(jié),除2為采樣寬度 n = (f.tell() - 44) // 2 # 創(chuàng)建數(shù)組,儲存data部分?jǐn)?shù)據(jù) buf = array.array('h', []) # 將文件的數(shù)據(jù)讀入到buf當(dāng)中,不返回字符串 f.seek(44) buf.fromfile(f, n) print(buf[0]) print(len(buf)) # 將采樣縮小一定程度,最終體現(xiàn)就是聲音變小 for i in range(n): buf[i] //= 8 # 將數(shù)據(jù)存入到一個新文件 f2 = open('demo.wav', 'wb') f2.write(info) buf.tofile(f2) f2.close()
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實現(xiàn)判斷一個整數(shù)是否為回文數(shù)算法示例
這篇文章主要介紹了Python實現(xiàn)判斷一個整數(shù)是否為回文數(shù)算法,結(jié)合實例形式分析了Python針對字符串的翻轉(zhuǎn)、判斷等相關(guān)操作技巧,需要的朋友可以參考下2019-03-03python中l(wèi)ambda函數(shù) list comprehension 和 zip函數(shù)使用指南
這篇文章主要介紹了python中l(wèi)ambda函數(shù) list comprehension 和 zip函數(shù)使用方法,非常的實用,有需要的朋友可以參考下2014-09-09Python的進(jìn)制轉(zhuǎn)換和ASCLL轉(zhuǎn)換你了解嗎
這篇文章主要為大家詳細(xì)介紹了Python的進(jìn)制轉(zhuǎn)換和ASCLL轉(zhuǎn)換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02python編程使用協(xié)程并發(fā)的優(yōu)缺點
協(xié)程是一種用戶態(tài)的輕量級線程,又稱微線程。這篇文章主要介紹了python編程使用協(xié)程并發(fā)的優(yōu)缺點,感興趣的朋友跟隨小編一起看看吧2018-09-09使用Python實現(xiàn)在Word文檔中進(jìn)行郵件合并
郵件合并是現(xiàn)代辦公中一項顯著提升效率的技術(shù),它巧妙地將大量個體數(shù)據(jù)與預(yù)設(shè)的文檔模板相結(jié)合,實現(xiàn)了一次性批量生成定制化文檔,下面我們就來看看如何使用Python實現(xiàn)在Word文檔中進(jìn)行郵件合并吧2024-04-04

pytorch 實現(xiàn)cross entropy損失函數(shù)計算方式