wave --- 讀寫WAV格式文件?
源代碼: Lib/wave.py
wave 模塊提供了一個處理 WAV 聲音格式的便利接口。它不支持壓縮/解壓,但是支持單聲道/立體聲。
wave 模塊定義了以下函數和異常:
-
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()函數可以在with語句中使用。 當with阻塞結束時,Wave_read.close()或Wave_write.close()方法會被調用。在 3.4 版更改: 添加了對不可搜索文件的支持。
-
wave.openfp(file, mode)? 同
open(),用于向后兼容。Deprecated since version 3.7, will be removed in version 3.9.
-
exception
wave.Error? 當不符合WAV格式或無法操作時引發的錯誤。
Wave_read對象?
由 open() 返回的 Wave_read 對象,有以下幾種方法:
-
Wave_read.getnchannels()? 返回聲道數量(
1為單聲道,2為立體聲)
-
Wave_read.getsampwidth()? 返回采樣字節長度。
-
Wave_read.getframerate()? 返回采樣頻率。
-
Wave_read.getnframes()? 返回音頻總幀數。
-
Wave_read.getcomptype()? 返回壓縮類型(只支持
'NONE'類型)
-
Wave_read.getcompname()? getcomptype()的通俗版本。使用'not compressed'代替'NONE'。
-
Wave_read.getparams()? 返回一個
namedtuple()(nchannels, sampwidth, framerate, nframes, comptype, compname),與get*()方法的輸出相同。
-
Wave_read.rewind()? 重置文件指針至音頻開頭.
后面兩個方法是為了和 aifc 保持兼容,實際不做任何事情。
-
Wave_read.getmarkers()? 返回
None。
-
Wave_read.getmark(id)? 引發錯誤異常。
以下兩個方法都使用指針,具體實現由其底層決定。
-
Wave_read.setpos(pos)? 設置文件指針到指定位置。
-
Wave_read.tell()? 返回當前文件指針位置。
Wave_write 對象?
對于可查找的輸出流,wave 頭將自動更新以反映實際寫入的幀數。 對于不可查找的流,當寫入第一幀時 nframes 值必須準確。 獲取準確的 nframes 值可以通過調用 setnframes() 或 setparams() 并附帶 close() 被調用之前將要寫入的幀數,然后使用 writeframesraw() 來寫入幀數據,或者通過調用 writeframes() 并附帶所有要寫入的幀。 在后一種情況下 writeframes() 將計算數據中的幀數并在寫入幀數據之前相應地設置 nframes。
由 open() 返回的 Wave_write 對象,有以下幾種方法:
在 3.4 版更改: 添加了對不可搜索文件的支持。
-
Wave_write.close()? 確保 nframes 是正確的,并在文件被
wave打開時關閉它。 此方法會在對象收集時被調用。 如果輸出流不可查找且 nframes 與實際寫入的幀數不匹配時引發異常。
-
Wave_write.setnchannels(n)? 設置聲道數。
-
Wave_write.setsampwidth(n)? 設置采樣字節長度為 n。
-
Wave_write.setframerate(n)? 設置采樣頻率為 n。
在 3.2 版更改: 對此方法的非整數輸入會被舍入到最接近的整數。
-
Wave_write.setnframes(n)? 設置總幀數為 n。 如果與之后實際寫入的幀數不一致此值將會被更改( 如果輸出流不可查找則此更改嘗試將引發錯誤)。
-
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)? 寫入音頻數據但不更新 nframes。
在 3.4 版更改: 現在可接受任意 bytes-like object。
-
Wave_write.writeframes(data)? 寫入音頻幀并確保 nframes 是正確的。 如果輸出流不可查找且在 data 被寫入之后寫入的總幀數與之前設定的has been written does not match the previously set value for nframes 值不匹配將會引發錯誤。
在 3.4 版更改: 現在可接受任意 bytes-like object。
注意在調用 writeframes() 或 writeframesraw() 之后再設置任何格式參數是無效的,而且任何這樣的嘗試將引發 wave.Error。
