Skip to main content

22.4. wave —读写WAV文件

源代码: Lib/wave.py


wave 模块为WAV声音格式提供了方便的界面。它不支持压缩/解压缩,但它支持单声道/立体声。

wave 模块定义了以下功能和异常:

wave.open(file, mode=None)

如果 file 是字符串,请按该名称打开文件,否则将其视为类文件对象。 mode 可以是:

'rb'

只读模式。

'wb'

只写模式。

注意,它不允许读/写WAV文件。

'rb'mode 返回 Wave_read 对象,而 'wb'mode 返回 Wave_write 对象。如果省略 mode 并且类文件对象作为 file 传递,则使用 file.mode 作为 mode 的默认值。

如果你传递一个类文件对象,当它的 close() 方法被调用时,wave对象不会关闭它;它是调用者的责任关闭文件对象。

open() 函数可以在 with 语句中使用。当 with 块完成时,调用 Wave_read.close()Wave_write.close() 方法。

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

wave.openfp(file, mode)

open() 的同义词,为了向后兼容性而维护。

exception wave.Error

当某些内容不可能因为它违反了WAV规范或者遇到实现缺陷时出现的错误。

22.4.1. Wave_read对象

open() 返回的Wave_read对象有以下方法:

Wave_read.close()

关闭流(如果流由 wave 打开),并使实例不可用。这在对象收集时自动调用。

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.readframes(n)

读取并返回大多数 n 音频帧,作为 bytes 对象。

Wave_read.rewind()

将文件指针回滚到音频流的开头。

为了与 aifc 模块兼容,定义了以下两种方法,并且不做任何有趣的事情。

Wave_read.getmarkers()

返回 None

Wave_read.getmark(id)

引发错误。

以下两种方法定义术语“位置”,它们之间是兼容的,否则是实现相关的。

Wave_read.setpos(pos)

将文件指针设置为指定位置。

Wave_read.tell()

返回当前文件指针位置。

22.4.2. Wave_write对象

对于可寻找的输出流,wave 头部将自动更新以反映实际写入的帧数。对于不可搜索的流,当写入第一帧数据时,nframes 值必须准确。通过调用 setnframes()setparams() (在调用 close() 之前将被写入的帧的数量,然后使用 writeframesraw() 写入帧数据,或者通过调用具有要写入的所有帧数据的 writeframes()),可以实现精确的 nframes 值。在后一种情况下,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 写入后已写入的帧总数与先前为 nframes 设置的值不匹配,则将引发错误。

在 3.4 版更改: 任何 bytes-like object 现已被接受。

注意,在调用 writeframes()writeframesraw() 后设置任何参数是无效的,任何尝试这样做都将引发 wave.Error