22.2. aifc — 读写 AIFF 和 AIFC 文件 — Python 文档
22.2. 国际金融中心 — 读写 AIFF 和 AIFC 文件
该模块支持读写 AIFF 和 AIFF-C 文件。 AIFF 是音频交换文件格式,一种用于在文件中存储数字音频样本的格式。 AIFF-C 是该格式的较新版本,包括压缩音频数据的能力。
音频文件有许多描述音频数据的参数。 采样率或帧率是每秒采样声音的次数。 通道数表示音频是单声道、立体声还是四声道。 每一帧由每个通道的一个样本组成。 样本大小是每个样本的字节大小。 因此,一帧由 nchannels * samplesize
字节组成,一秒的音频由 nchannels * samplesize * framerate
字节组成。
例如,CD 质量音频的样本大小为两个字节(16 位),使用两个通道(立体声),帧速率为 44,100 帧/秒。 这给出了 4 字节 (2*2) 的帧大小,一秒的价值占用 2*2*44100 字节(176,400 字节)。
模块 aifc 定义了以下函数:
- aifc.open(file, mode=None)
打开 AIFF 或 AIFF-C 文件并返回一个对象实例,其方法如下所述。 参数 file 是命名文件的字符串或 文件对象 。 mode 必须是
'r'
或'rb'
文件必须打开读取,或'w'
或'wb'
文件必须是开放写作。 如果省略,则使用file.mode
(如果存在),否则使用'rb'
。 用于写入时,文件对象应该是可查找的,除非您提前知道总共要写入多少个样本并使用writeframesraw()
和setnframes()
。 open() 函数可以用在 with 语句中。 当 with 块完成时,会调用 close() 方法。3.4 版更改: 添加了对 with 语句的支持。
open()在打开文件进行读取时返回的对象有以下方法:
- aifc.getnchannels()
- 返回音频通道的数量(单声道为 1,立体声为 2)。
- aifc.getsampwidth()
- 返回单个样本的大小(以字节为单位)。
- aifc.getframerate()
- 返回采样率(每秒音频帧数)。
- aifc.getnframes()
- 返回文件中的音频帧数。
- aifc.getcomptype()
- 返回一个长度为 4 的字节数组,描述音频文件中使用的压缩类型。 对于 AIFF 文件,返回值为
b'NONE'
。
- aifc.getcompname()
- 返回一个字节数组,该数组可转换为音频文件中使用的压缩类型的人类可读描述。 对于 AIFF 文件,返回值为
b'not compressed'
。
- aifc.getparams()
- 返回一个 namedtuple()
(nchannels, sampwidth, framerate, nframes, comptype, compname)
,相当于get*()
方法的输出。
- aifc.getmarkers()
- 返回音频文件中的标记列表。 标记由三个元素的元组组成。 第一个是标记 ID(一个整数),第二个是从数据开始的帧中的标记位置(一个整数),第三个是标记的名称(一个字符串)。
- aifc.getmark(id)
- 返回 getmarkers() 中描述的元组,用于具有给定 id 的标记。
- aifc.readframes(nframes)
- 从音频文件中读取并返回下一个 nframes 帧。 返回的数据是一个字符串,包含每帧所有通道的未压缩样本。
- aifc.rewind()
- 倒回读指针。 下一个 readframes() 将从头开始。
- aifc.setpos(pos)
- 寻找指定的帧号。
- aifc.tell()
- 返回当前帧号。
- aifc.close()
- 关闭 AIFF 文件。 调用此方法后,该对象不能再使用。
open() 在打开文件写入时返回的对象具有上述所有方法,除了 readframes()
和 setpos()
。 此外,还有以下方法。 get*()
方法只能在相应的 set*()
方法被调用后才能被调用。 在第一个writeframes()
或writeframesraw()
之前,除帧数外的所有参数都必须填写。
- aifc.aiff()
- 创建一个 AIFF 文件。 默认是创建一个 AIFF-C 文件,除非文件名以
'.aiff'
结尾,在这种情况下默认是 AIFF 文件。
- aifc.aifc()
- 创建一个 AIFF-C 文件。 默认是创建一个 AIFF-C 文件,除非文件名以
'.aiff'
结尾,在这种情况下默认是 AIFF 文件。
- aifc.setnchannels(nchannels)
- 指定音频文件中的通道数。
- aifc.setsampwidth(width)
- 指定音频样本的字节大小。
- aifc.setframerate(rate)
- 以每秒帧数指定采样频率。
- aifc.setnframes(nframes)
- 指定要写入音频文件的帧数。 如果该参数没有设置,或者设置不正确,则文件需要支持搜索。
- aifc.setcomptype(type, name)
- 指定压缩类型。 如果未指定,则不会压缩音频数据。 在 AIFF 文件中,无法进行压缩。 name 参数应该是字节数组形式的压缩类型的人类可读描述,type 参数应该是长度为 4 的字节数组。 目前支持以下压缩类型:
b'NONE'
、b'ULAW'
、b'ALAW'
、b'G722'
。
- aifc.setparams(nchannels, sampwidth, framerate, comptype, compname)
- 一次性设置以上所有参数。 参数是一个由各种参数组成的元组。 这意味着可以使用 getparams() 调用的结果作为 setparams() 的参数。
- aifc.setmark(id, pos, name)
- 在给定位置添加具有给定 id(大于 0)和给定名称的标记。 该方法可以在 close() 之前的任何时间调用。
- aifc.tell()
- 返回输出文件中的当前写入位置。 与 setmark() 结合使用很有用。
- aifc.writeframes(data)
将数据写入输出文件。 此方法只能在设置音频文件参数后调用。
在 3.4 版更改:现在接受任何 bytes-like object。
- aifc.writeframesraw(data)
和 writeframes() 一样,只是音频文件的头部没有更新。
在 3.4 版更改:现在接受任何 bytes-like object。
- aifc.close()
- 关闭 AIFF 文件。 更新文件的标题以反映音频数据的实际大小。 调用此方法后,该对象不能再使用。