wave
— 讀取和寫入 WAV 檔案¶
原始碼: Lib/wave.py
wave
模組提供了一個方便的介面來處理波形音訊 “WAVE”(或 “WAV”)檔案格式。僅支援未壓縮的 PCM 編碼的 wave 檔案。
在 3.12 版本中變更: 添加了對 WAVE_FORMAT_EXTENSIBLE
標頭的支援,前提是擴充套件格式為 KSDATAFORMAT_SUBTYPE_PCM
。
wave
模組定義了以下函式和異常
- wave.open(file, mode=None)¶
如果 file 是一個字串,則按該名稱開啟檔案,否則將其視為類似檔案的物件。mode 可以是
'rb'
只讀模式。
'wb'
只寫模式。
請注意,它不允許讀取/寫入 WAV 檔案。
mode 為
'rb'
時返回一個Wave_read
物件,而 mode 為'wb'
時返回一個Wave_write
物件。如果省略 mode 並且將類似檔案的物件作為 file 傳遞,則使用file.mode
作為 mode 的預設值。如果你傳入一個類似檔案的物件,當呼叫它的
close()
方法時,wave 物件不會關閉它;關閉檔案物件是呼叫者的責任。open()
函式可以在with
語句中使用。當with
塊完成時,將呼叫Wave_read.close()
或Wave_write.close()
方法。在 3.4 版本中變更: 添加了對不可搜尋檔案的支援。
- exception wave.Error¶
當由於違反 WAV 規範或遇到實現缺陷而導致某些事情無法完成時引發的錯誤。
Wave_read 物件¶
- class wave.Wave_read¶
讀取 WAV 檔案。
由
open()
返回的 Wave_read 物件具有以下方法- getnchannels()¶
返回音訊通道數(單聲道為
1
,立體聲為2
)。
- getsampwidth()¶
返回樣本寬度(以位元組為單位)。
- getframerate()¶
返回取樣頻率。
- getnframes()¶
返回音訊幀數。
- getcomptype()¶
返回壓縮型別(唯一支援的型別是
'NONE'
)。
- getcompname()¶
getcomptype()
的人類可讀版本。通常,'not compressed'
與'NONE'
相對應。
- getparams()¶
返回一個
namedtuple()
(nchannels, sampwidth, framerate, nframes, comptype, compname)
,等同於get*()
方法的輸出。
- rewind()¶
將檔案指標倒回到音訊流的開頭。
為了與舊的
aifc
模組相容,定義了以下兩個方法,它們沒有做任何有趣的事情。- getmarkers()¶
返回
None
。自 3.13 版本起棄用,將在 3.15 版本中移除: 該方法僅是為了與
aifc
模組相容,該模組已在 Python 3.13 中刪除。
- getmark(id)¶
引發錯誤。
自 3.13 版本起棄用,將在 3.15 版本中移除: 該方法僅是為了與
aifc
模組相容,該模組已在 Python 3.13 中刪除。
以下兩個方法定義了一個術語“位置”,它們之間是相容的,否則它將依賴於實現。
- setpos(pos)¶
將檔案指標設定到指定位置。
- tell()¶
返回當前檔案指標位置。
Wave_write 物件¶
- class wave.Wave_write¶
寫入 WAV 檔案。
由
open()
返回的 Wave_write 物件。對於可搜尋的輸出流,
wave
標頭將自動更新以反映實際寫入的幀數。對於不可搜尋的流,當寫入第一個幀資料時,nframes 值必須準確。可以透過呼叫setnframes()
或setparams()
並指定在呼叫close()
之前將要寫入的幀數,然後使用writeframesraw()
寫入幀資料,或者透過呼叫writeframes()
並指定所有要寫入的幀資料來獲得準確的 nframes 值。在後一種情況下,writeframes()
將計算資料中的幀數,並在寫入幀資料之前相應地設定 nframes。在 3.4 版本中變更: 添加了對不可搜尋檔案的支援。
Wave_write 物件具有以下方法
- close()¶
確保 nframes 的值正確,如果檔案是由
wave
開啟的,則關閉該檔案。 此方法在物件回收時呼叫。如果輸出流不可查詢,且 nframes 與實際寫入的幀數不匹配,則會引發異常。
- setnchannels(n)¶
設定聲道數。
- setsampwidth(n)¶
設定取樣寬度為 n 位元組。
- setframerate(n)¶
設定幀率為 n。
在 3.2 版本中更改: 此方法的非整數輸入將四捨五入為最接近的整數。
- setnframes(n)¶
設定幀數為 n。如果實際寫入的幀數不同,則稍後會更改此值(如果輸出流不可查詢,則此更新嘗試將引發錯誤)。
- setcomptype(type, name)¶
設定壓縮型別和描述。目前,僅支援壓縮型別
NONE
,表示不壓縮。
- setparams(tuple)¶
tuple 應該為
(nchannels, sampwidth, framerate, nframes, comptype, compname)
,其值對set*()
方法有效。設定所有引數。
- tell()¶
返回檔案中的當前位置,與
Wave_read.tell()
和Wave_read.setpos()
方法的免責宣告相同。
- writeframes(data)¶
寫入音訊幀,並確保 nframes 的值正確。如果輸出流不可查詢,並且在寫入 data 後已寫入的總幀數與先前為 nframes 設定的值不匹配,則會引發錯誤。
在 3.4 版本中更改: 現在接受任何 類位元組物件。
請注意,在呼叫
writeframes()
或writeframesraw()
之後設定任何引數都是無效的,任何嘗試這樣做都會引發wave.Error
。