wave - 读取和写入 WAV 文件

源代码: Lib/wave.py


wave 模块为 Waveform Audio “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 的默认值。

如果传入类文件对象,则 wave 对象在调用其 close() 方法时不会关闭它;关闭文件对象是调用者的责任。

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

3.4 版更改: 添加了对不可查找文件的支持。

异常 wave.Error

当某些事情因违反 WAV 规范或遇到实现缺陷而无法实现时引发的错误。

Wave_read 对象

wave.Wave_read

读取 WAV 文件。

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

close()

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

getnchannels()

返回音频通道数(单声道为 1,立体声为 2)。

getsampwidth()

返回以字节为单位的样本宽度。

getframerate()

返回采样频率。

getnframes()

返回音频帧数。

getcomptype()

返回压缩类型('NONE' 是唯一支持的类型)。

getcompname()

getcomptype() 的人类可读版本。通常 'not compressed''NONE' 相对应。

getparams()

返回一个 namedtuple() (nchannels, sampwidth, framerate, nframes, comptype, compname),等效于 get*() 方法的输出。

readframes(n)

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

rewind()

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

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

getmarkers()

返回 None

getmark(id)

引发错误。

以下两种方法定义了一个“位置”术语,该术语在它们之间兼容,并且在其他方面依赖于实现。

setpos(pos)

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

tell()

返回当前文件指针位置。

Wave_write 对象

class wave.Wave_write

写入 WAV 文件。

Wave_write 对象,由 open() 返回。

对于可查找的输出流,wave 标头将自动更新以反映实际写入的帧数。对于不可查找的流,在写入第一个帧数据时,*nframes* 值必须准确。可以通过在调用 close() 之前调用 setnframes()setparams() 并设置将写入的帧数,然后使用 writeframesraw() 写入帧数据来实现准确的 *nframes* 值,或者通过调用 writeframes() 并传入要写入的所有帧数据。在后一种情况下,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() 方法使用相同的免责声明。

writeframesraw(data)

写入音频帧,不校正 *nframes*。

在 3.4 版更改: 现在接受任何 类字节对象

writeframes(data)

写入音频帧并确保 *nframes* 正确。如果输出流不可查找,并且写入 *data* 后写入的帧总数与先前为 *nframes* 设置的值不匹配,则会引发错误。

在 3.4 版更改: 现在接受任何 类字节对象

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