wave
— 讀取和寫入 WAV 檔案¶
原始碼: Lib/wave.py
wave
模組提供了 Waveform Audio “WAVE”(或“WAV”)檔案格式的便捷介面。僅支援未壓縮的 PCM 編碼 wave 檔案。
3.12 版本中的變化: 增加了對 WAVE_FORMAT_EXTENSIBLE
頭的支援,前提是擴充套件格式為 KSDATAFORMAT_SUBTYPE_PCM
。
wave
模組定義了以下函式和異常
- wave.open(file, mode=None)¶
如果 file 是一個字串,則按該名稱開啟檔案;否則,將其視為檔案類物件。mode 可以是
'rb'
只讀模式。
'wb'
只寫模式。
請注意,它不允許讀/寫 WAV 檔案。
'rb'
模式返回一個Wave_read
物件,而'wb'
模式返回一個Wave_write
物件。如果省略 mode 並且將檔案類物件作為 file 傳遞,則使用file.mode
作為 mode 的預設值。如果傳入一個檔案類物件,當 wave 物件的
close()
方法被呼叫時,它不會關閉該檔案;關閉檔案物件的責任在於呼叫者。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 物件具有以下方法
- 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
。