# 22.2. `aifc` - 读取和写入AIFF和AIFC文件

源代码： Lib / aifc.py

此模块支持读写AIFF和AIFF-C文件。AIFF是音频交换文件格式，用于将数字音频样本存储在文件中的格式。AIFF-C是包括压缩音频数据的能力的格式的较新版本。

注意

一些操作只能在IRIX下工作；在尝试导入`cl`模块时，这些将引发`ImportError`，该模块仅在IRIX上可用。

音频文件具有描述音频数据的多个参数。采样率或帧率是声音被采样的每秒的次数。通道数指示音频是单声道，立体声还是四声道。每个帧由每个通道一个样本组成。样本大小是每个样本的字节大小。Thus a frame consists of `nchannels * samplesize` bytes, and a second’s worth of audio consists of `nchannels * samplesize * framerate` bytes.

例如，CD质量音频具有两个字节（16位）的样本大小，使用两个声道（立体声）并且具有44,100帧/秒的帧速率。这给出了4字节（2 * 2）的帧大小，并且第二值的占用2 * 2 * 44100字节（176,400字节）。

模块`aifc`定义了以下函数：

`aifc.``open`(file, mode=None)

  打开AIFF或AIFF-C文件并返回对象实例，方法如下所述。参数文件是命名文件的字符串或file object。当文件必须打开以便读取时，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， t7> 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文件。调用此方法后，对象将无法再使用。

除了`readframes()`和`setpos()`之外，当文件打开以进行写入时，`open()`返回的对象具有上述所有方法。此外，存在以下方法。只有在相应的`set*()`方法被调用后，才能调用`get*()`方法。在第一个`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文件。文件的头部被更新以反映音频数据的实际大小。调用此方法后，对象将无法再使用。