wave
--- 讀寫WAV格式文件?
源代碼: Lib/wave.py
wave
模塊提供了一個(gè)處理 WAV 聲音格式的便利接口。它不支持壓縮/解壓,但是支持單聲道/立體聲。
wave
模塊定義了以下函數(shù)和異常:
- wave.open(file, mode=None)?
如果 file 是一個(gè)字符串,打開對(duì)應(yīng)文件名的文件。否則就把它作為文件類對(duì)象來處理。mode 可以為以下值:
'rb'
只讀模式。
'wb'
只寫模式。
注意不支持同時(shí)讀寫WAV文件。
mode 設(shè)為
'rb'
時(shí)返回一個(gè)Wave_read
對(duì)象,而 mode 設(shè)為'wb'
時(shí)返回一個(gè)Wave_write
對(duì)象。如果省略 mode 并指定 file 來傳入一個(gè)文件類對(duì)象,則file.mode
會(huì)被用作 mode 的默認(rèn)值。如果操作的是文件對(duì)象,當(dāng)使用 wave 對(duì)象的
close()
方法時(shí),并不會(huì)真正關(guān)閉文件對(duì)象,這需要調(diào)用者負(fù)責(zé)來關(guān)閉文件對(duì)象。open()
函數(shù)可以在with
語(yǔ)句中使用。 當(dāng)with
阻塞結(jié)束時(shí),Wave_read.close()
或Wave_write.close()
方法會(huì)被調(diào)用。在 3.4 版更改: 添加了對(duì)不可搜索文件的支持。
- exception wave.Error?
當(dāng)不符合WAV格式或無法操作時(shí)引發(fā)的錯(cuò)誤。
Wave_read對(duì)象?
由 open()
返回的 Wave_read 對(duì)象,有以下幾種方法:
- Wave_read.close()?
關(guān)閉
wave
打開的數(shù)據(jù)流并使對(duì)象不可用。當(dāng)對(duì)象銷毀時(shí)會(huì)自動(dòng)調(diào)用。
- Wave_read.getnchannels()?
返回聲道數(shù)量(
1
為單聲道,2
為立體聲)
- Wave_read.getsampwidth()?
返回采樣字節(jié)長(zhǎng)度。
- Wave_read.getframerate()?
返回采樣頻率。
- Wave_read.getnframes()?
返回音頻總幀數(shù)。
- Wave_read.getcomptype()?
返回壓縮類型(只支持
'NONE'
類型)
- Wave_read.getcompname()?
getcomptype()
的通俗版本。使用'not compressed'
代替'NONE'
。
- Wave_read.getparams()?
返回一個(gè)
namedtuple()
(nchannels, sampwidth, framerate, nframes, comptype, compname)
,與get*()
方法的輸出相同。
- Wave_read.rewind()?
重置文件指針至音頻開頭.
后面兩個(gè)方法是為了和 aifc
保持兼容,實(shí)際不做任何事情。
- Wave_read.getmarkers()?
返回
None
。
- Wave_read.getmark(id)?
引發(fā)錯(cuò)誤異常。
以下兩個(gè)方法都使用指針,具體實(shí)現(xiàn)由其底層決定。
- Wave_read.setpos(pos)?
設(shè)置文件指針到指定位置。
- Wave_read.tell()?
返回當(dāng)前文件指針位置。
Wave_write 對(duì)象?
對(duì)于可查找的輸出流,wave
頭將自動(dòng)更新以反映實(shí)際寫入的幀數(shù)。 對(duì)于不可查找的流,當(dāng)寫入第一幀時(shí) nframes 值必須準(zhǔn)確。 獲取準(zhǔn)確的 nframes 值可以通過調(diào)用 setnframes()
或 setparams()
并附帶 close()
被調(diào)用之前將要寫入的幀數(shù),然后使用 writeframesraw()
來寫入幀數(shù)據(jù),或者通過調(diào)用 writeframes()
并附帶所有要寫入的幀。 在后一種情況下 writeframes()
將計(jì)算數(shù)據(jù)中的幀數(shù)并在寫入幀數(shù)據(jù)之前相應(yīng)地設(shè)置 nframes。
由 open()
返回的 Wave_write 對(duì)象,有以下幾種方法:
在 3.4 版更改: 添加了對(duì)不可搜索文件的支持。
- Wave_write.close()?
確保 nframes 是正確的,并在文件被
wave
打開時(shí)關(guān)閉它。 此方法會(huì)在對(duì)象收集時(shí)被調(diào)用。 如果輸出流不可查找且 nframes 與實(shí)際寫入的幀數(shù)不匹配時(shí)引發(fā)異常。
- Wave_write.setnchannels(n)?
設(shè)置聲道數(shù)。
- Wave_write.setsampwidth(n)?
設(shè)置采樣字節(jié)長(zhǎng)度為 n。
- Wave_write.setframerate(n)?
設(shè)置采樣頻率為 n。
在 3.2 版更改: 對(duì)此方法的非整數(shù)輸入會(huì)被舍入到最接近的整數(shù)。
- Wave_write.setnframes(n)?
設(shè)置總幀數(shù)為 n。 如果與之后實(shí)際寫入的幀數(shù)不一致此值將會(huì)被更改( 如果輸出流不可查找則此更改嘗試將引發(fā)錯(cuò)誤)。
- Wave_write.setcomptype(type, name)?
設(shè)置壓縮格式。目前只支持
NONE
即無壓縮格式。
- Wave_write.setparams(tuple)?
tuple 應(yīng)該是
(nchannels, sampwidth, framerate, nframes, comptype, compname)
,每項(xiàng)的值應(yīng)可用于set*()
方法。設(shè)置所有形參。
- Wave_write.tell()?
返回當(dāng)前文件指針,其指針含義和
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ù)與之前設(shè)定的 nframes 值不匹配將會(huì)引發(fā)錯(cuò)誤。
在 3.4 版更改: 現(xiàn)在可接受任意 bytes-like object。
注意在調(diào)用 writeframes()
或 writeframesraw()
之后再設(shè)置任何格式參數(shù)是無效的,而且任何這樣的嘗試將引發(fā) wave.Error
。