# 22.3. `sunau` - 读写Sun AU文件

源代码： Lib / sunau.py

`sunau`模块为Sun AU声音格式提供了方便的界面。请注意，此模块与模块`aifc`和`wave`接口兼容。

音频文件由标题后跟数据组成。标题的字段是：

领域 | 内容
--- | ---
魔术词 | 四个字节`.snd`。
标题大小 | 头的大小，包括info，以字节为单位。
数据大小 | 数据的物理大小（以字节为单位）。
编码 | 指示音频样本的编码方式。
采样率 | 采样率。
频道数量 | 样本中的通道数。
信息 | 给出音频文件描述的ASCII字符串（用空字节填充）。

除了info字段，所有头字段的大小为4字节。它们都是以大端字节顺序编码的32位无符号整数。

`sunau`模块定义以下功能：

`sunau.``open`(file, mode)

  如果文件是字符串，请按该名称打开该文件，否则将其视为可搜索的类文件对象。模式可以是任何一种

  `'r'`
    只读模式。
  `'w'`
    只写模式。

  请注意，它不允许读/写文件。

  A mode of `'r'` returns an `AU_read` object, while a mode of `'w'` or `'wb'` returns an `AU_write` object.

`sunau.``openfp`(file, mode)

  为维持向后兼容性的`open()`的同义词。

`sunau`模块定义了以下异常：

exception `sunau.``Error`

  当由于Sun AU规范或实现缺陷而导致某些不可能的错误。

`sunau`模块定义以下数据项：

`sunau.``AUDIO_FILE_MAGIC`

  每个有效的Sun AU文件的整数开始，以big-endian形式存储。这是解释为整数的字符串`.snd`。

`sunau.``AUDIO_FILE_ENCODING_MULAW_8`
`sunau.``AUDIO_FILE_ENCODING_LINEAR_8`
`sunau.``AUDIO_FILE_ENCODING_LINEAR_16`
`sunau.``AUDIO_FILE_ENCODING_LINEAR_24`
`sunau.``AUDIO_FILE_ENCODING_LINEAR_32`
`sunau.``AUDIO_FILE_ENCODING_ALAW_8`

  此模块支持的AU头中的编码字段的值。

`sunau.``AUDIO_FILE_ENCODING_FLOAT`
`sunau.``AUDIO_FILE_ENCODING_DOUBLE`
`sunau.``AUDIO_FILE_ENCODING_ADPCM_G721`
`sunau.``AUDIO_FILE_ENCODING_ADPCM_G722`
`sunau.``AUDIO_FILE_ENCODING_ADPCM_G723_3`
`sunau.``AUDIO_FILE_ENCODING_ADPCM_G723_5`

  来自AU头的编码字段的其他已知值，但不受此模块支持。

## 22.3.1. AU_read Objects

由上述`open()`返回的AU_read对象具有以下方法：

`AU_read.``close`()

  关闭流，并使实例不可用。（删除时自动调用。）

`AU_read.``getnchannels`()

  返回音频通道数（1表示mone，2表示立体声）。

`AU_read.``getsampwidth`()

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

`AU_read.``getframerate`()

  返回采样频率。

`AU_read.``getnframes`()

  返回音频帧数。

`AU_read.``getcomptype`()

  返回压缩类型。支持的压缩类型为`'ULAW'`，`'ALAW'`和`'NONE'`。

`AU_read.``getcompname`()

  `getcomptype()`的人类可读版本。支持的类型有各自的名称`'CCITT G.711 u-law'`，`'CCITT G.711 A-law'` and `'not compressed'` 。

`AU_read.``getparams`()

  传回`namedtuple()` `（nchannels， sampwidth， framerate， nframes， t7> comptype， compname）`，相当于`get*()`

`AU_read.``readframes`(n)

  读取并返回最多n个音频帧，以字节为单位。数据将以线性格式返回。如果原始数据为u-LAW格式，则将进行转换。

`AU_read.``rewind`()

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

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

`AU_read.``setpos`(pos)

  将文件指针设置为指定位置。从`tell()`返回的值应该用于pos。

`AU_read.``tell`()

  返回当前文件指针位置。请注意，返回的值与文件中的实际位置无关。

为了与`aifc`兼容，定义了以下两个函数，不要做任何有趣的事情。

`AU_read.``getmarkers`()

  返回`None`。

`AU_read.``getmark`(id)

  引发错误。

## 22.3.2. AU_write Objects

由上述`open()`返回的AU_write对象具有以下方法：

`AU_write.``setnchannels`(n)

  设置通道数。

`AU_write.``setsampwidth`(n)

  设置样本宽度（以字节为单位）。

  在版本3.4中进行了更改：添加了对24位示例的支持。

`AU_write.``setframerate`(n)

  设置帧速率。

`AU_write.``setnframes`(n)

  设置帧数。这可以稍后更改，当和如果写入更多的帧。

`AU_write.``setcomptype`(type, name)

  设置压缩类型和描述。在输出上仅支持`'NONE'`和`'ULAW'`。

`AU_write.``setparams`(tuple)

  元组应为`（nchannels， sampwidth， framerate， nframes， t5 > comptype， compname）`，其值对于`set*()`设置所有参数。

`AU_write.``tell`()

  返回文件中的当前位置，对`AU_read.tell()`和`AU_read.setpos()`方法使用相同的免责声明。

`AU_write.``writeframesraw`(data)

  写入音频帧，而不更正nframes。

  在版本3.4中更改：现在接受任何bytes-like object。

`AU_write.``writeframes`(data)

  写入音频帧，并确保nframes正确。

  在版本3.4中更改：现在接受任何bytes-like object。

`AU_write.``close`()

  确保nframes正确，然后关闭文件。

  删除时调用此方法。

请注意，在调用`writeframes()`或`writeframesraw()`之后设置任何参数无效。