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

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