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 对象具有以下方法- getnchannels()¶
返回音频通道数(单声道为
1
,立体声为2
)。
- getsampwidth()¶
返回样本宽度(以字节为单位)。
- getframerate()¶
返回采样频率。
- getnframes()¶
返回音频帧数。
- getcomptype()¶
返回压缩类型(唯一支持的类型是
'NONE'
)。
- getcompname()¶
getcomptype()
的人类可读版本。通常,'not compressed'
与'NONE'
相对应。
- getparams()¶
返回一个
namedtuple()
(nchannels, sampwidth, framerate, nframes, comptype, compname)
,等同于get*()
方法的输出。
- 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()
方法的免责声明相同。
- writeframes(data)¶
写入音频帧,并确保 nframes 的值正确。如果输出流不可查找,并且在写入 data 后已写入的总帧数与先前为 nframes 设置的值不匹配,则会引发错误。
在 3.4 版本中更改: 现在接受任何 类字节对象。
请注意,在调用
writeframes()
或writeframesraw()
之后设置任何参数都是无效的,任何尝试这样做都会引发wave.Error
。