wave --- 讀寫WAV格式文件?

源代碼: Lib/wave.py


wave 模塊提供了一個處理 WAV 聲音格式的便利接口。它不支持壓縮/解壓,但是支持單聲道/立體聲。

wave 模塊定義了以下函數(shù)和異常:

wave.open(file, mode=None)?

如果 file 是一個字符串,打開對應文件名的文件。否則就把它作為文件類對象來處理。mode 可以為以下值:

'rb'

只讀模式。

'wb'

只寫模式。

注意不支持同時讀寫WAV文件。

mode 設為 'rb' 時返回一個 Wave_read 對象,而 mode 設為 'wb' 時返回一個 Wave_write 對象。如果省略 mode 并指定 file 來傳入一個文件類對象,則 file.mode 會被用作 mode 的默認值。

如果操作的是文件對象,當使用 wave 對象的 close() 方法時,并不會真正關閉文件對象,這需要調用者負責來關閉文件對象。

open() 函數(shù)可以在 with 語句中使用。 當 with 阻塞結束時,Wave_read.close()Wave_write.close() 方法會被調用。

在 3.4 版更改: 添加了對不可搜索文件的支持。

exception wave.Error?

當不符合WAV格式或無法操作時引發(fā)的錯誤。

Wave_read對象?

open() 返回的 Wave_read 對象,有以下幾種方法:

Wave_read.close()?

關閉 wave 打開的數(shù)據(jù)流并使對象不可用。當對象銷毀時會自動調用。

Wave_read.getnchannels()?

返回聲道數(shù)量(1 為單聲道,2 為立體聲)

Wave_read.getsampwidth()?

返回采樣字節(jié)長度。

Wave_read.getframerate()?

返回采樣頻率。

Wave_read.getnframes()?

返回音頻總幀數(shù)。

Wave_read.getcomptype()?

返回壓縮類型(只支持 'NONE' 類型)

Wave_read.getcompname()?

getcomptype() 的通俗版本。使用 'not compressed' 代替 'NONE'。

Wave_read.getparams()?

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

Wave_read.readframes(n)?

讀取并返回以 bytes 對象表示的最多 n 幀音頻。

Wave_read.rewind()?

重置文件指針至音頻開頭.

后面兩個方法是為了和 aifc 保持兼容,實際不做任何事情。

Wave_read.getmarkers()?

返回 None

Wave_read.getmark(id)?

引發(fā)錯誤異常。

以下兩個方法都使用指針,具體實現(xiàn)由其底層決定。

Wave_read.setpos(pos)?

設置文件指針到指定位置。

Wave_read.tell()?

返回當前文件指針位置。

Wave_write 對象?

對于可查找的輸出流,wave 頭將自動更新以反映實際寫入的幀數(shù)。 對于不可查找的流,當寫入第一幀時 nframes 值必須準確。 獲取準確的 nframes 值可以通過調用 setnframes()setparams() 并附帶 close() 被調用之前將要寫入的幀數(shù),然后使用 writeframesraw() 來寫入幀數(shù)據(jù),或者通過調用 writeframes() 并附帶所有要寫入的幀。 在后一種情況下 writeframes() 將計算數(shù)據(jù)中的幀數(shù)并在寫入幀數(shù)據(jù)之前相應地設置 nframes。

open() 返回的 Wave_write 對象,有以下幾種方法:

在 3.4 版更改: 添加了對不可搜索文件的支持。

Wave_write.close()?

確保 nframes 是正確的,并在文件被 wave 打開時關閉它。 此方法會在對象收集時被調用。 如果輸出流不可查找且 nframes 與實際寫入的幀數(shù)不匹配時引發(fā)異常。

Wave_write.setnchannels(n)?

設置聲道數(shù)。

Wave_write.setsampwidth(n)?

設置采樣字節(jié)長度為 n。

Wave_write.setframerate(n)?

設置采樣頻率為 n。

在 3.2 版更改: 對此方法的非整數(shù)輸入會被舍入到最接近的整數(shù)。

Wave_write.setnframes(n)?

設置總幀數(shù)為 n。 如果與之后實際寫入的幀數(shù)不一致此值將會被更改( 如果輸出流不可查找則此更改嘗試將引發(fā)錯誤)。

Wave_write.setcomptype(type, name)?

設置壓縮格式。目前只支持 NONE 即無壓縮格式。

Wave_write.setparams(tuple)?

tuple 應該是 (nchannels, sampwidth, framerate, nframes, comptype, compname),每項的值應可用于 set*() 方法。設置所有形參。

Wave_write.tell()?

返回當前文件指針,其指針含義和 Wave_read.tell() 以及 Wave_read.setpos() 是一致的。

Wave_write.writeframesraw(data)?

寫入音頻數(shù)據(jù)但不更新 nframes。

在 3.4 版更改: 現(xiàn)在可接受任意 bytes-like object。

Wave_write.writeframes(data)?

寫入音頻幀并確保 nframes 是正確的。 如果輸出流不可查找且在 data 被寫入之后寫入的總幀數(shù)與之前設定的 nframes 值不匹配將會引發(fā)錯誤。

在 3.4 版更改: 現(xiàn)在可接受任意 bytes-like object

注意在調用 writeframes()writeframesraw() 之后再設置任何格式參數(shù)是無效的,而且任何這樣的嘗試將引發(fā) wave.Error。