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 物件具有以下方法

close()

如果流是由 wave 開啟的,則關閉流,並使例項不可用。這會在物件被回收時自動呼叫。

getnchannels()

返回音訊通道數(單聲道為 1,立體聲為 2)。

getsampwidth()

返回以位元組為單位的取樣寬度。

getframerate()

返回取樣頻率。

getnframes()

返回音訊幀數。

getcomptype()

返回壓縮型別('NONE' 是唯一支援的型別)。

getcompname()

getcomptype() 的人類可讀版本。通常 'not compressed''NONE' 相對應。

getparams()

返回一個 namedtuple() (nchannels, sampwidth, framerate, nframes, comptype, compname),相當於 get*() 方法的輸出。

readframes(n)

讀取並返回最多 n 幀音訊,作為 bytes 物件。

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() 方法具有相同的免責宣告。

writeframesraw(data)

寫入音訊幀,不校正 nframes

3.4 版本中的變化: 現在接受任何類位元組物件

writeframes(data)

寫入音訊幀並確保 nframes 正確。如果輸出流不可查詢,並且在寫入 data 後已寫入的總幀數與之前為 nframes 設定的值不匹配,則會引發錯誤。

3.4 版本中的變化: 現在接受任何類位元組物件

請注意,在呼叫 writeframes()writeframesraw() 之後設定任何引數都是無效的,任何嘗試這樣做都會引發 wave.Error