22.5. chunk - 读取IFF分块数据

源代码: Lib / chunk.py

此模块提供用于读取使用EA IFF 85块的文件的接口。[1]此格式至少用于音频交换文件格式(AIFF / AIFF-C)和真实媒体文件格式(RMFF)。WAVE音频文件格式是密切相关的,也可以使用此模块读取。

块具有以下结构:

抵消长度内容
04块ID
44块大小按big-endian字节顺序,不包括头
8n数据字节,其中n是前面字段中给出的大小
8 + n0或1如果n为奇数且使用块对齐,则需要填充字节

ID是一个4字节的字符串,用于标识块的类型。

大小字段(32位值,使用大端字节顺序编码)给出了块数据的大小,不包括8字节头。

通常,IFF类型的文件由一个或多个块组成。这里定义的Chunk类的建议用法是在每个块的开始处实例化一个实例,并从实例读取直到它到达结束,之后可以实例化一个新的实例。在文件结束时,创建新的实例将失败并出现EOFError异常。

class chunk.Chunk(file, align=True, bigendian=True, inclheader=False)

表示块的类。文件参数应为类文件对象。这个类的实例是特别允许的。唯一需要的方法是read()如果方法seek()tell()存在,并且不引发异常,它们也被使用。如果这些方法存在并引发异常,它们将不会改变对象。如果可选参数align为真,则假定块在2字节边界对齐。如果align为false,则不进行对齐。默认值为true。如果可选参数bigendian为假,则块大小假定为小端顺序。这是WAVE音频文件所需要的。默认值为true。如果可选参数inclheader为真,则块头中给出的大小包括头的大小。默认值为false。

Chunk对象支持以下方法:

getname()

返回块的名称(ID)。这是块的前4个字节。

getsize()

返回块的大小。

close()

关闭并跳到块的结尾。这不会关闭底层文件。

如果在close()方法被调用后调用,剩余的方法将引发OSError在Python 3.3之前,他们习惯于引发IOError,现在是OSError的别名。

isatty()

返回False

seek(pos, whence=0)

设置块的当前位置。whence参数是可选的,默认为0(绝对文件定位);其他值为1(相对于当前位置寻找)和2(相对于文件末尾寻找)。没有返回值。如果底层文件不允许seek,只允许前向寻道。

tell()

将当前位置返回到块中。

read(size=-1)

从块中读取最多size个字节(如果读取在获取大小字节之前命中块的末尾,则减少)。如果size参数为负或省略,读取所有数据,直到块的结束。当立即遇到块的结尾时,返回一个空字节对象。

skip()

跳到块的结尾。所有对read()的调用将返回b''如果你对块的内容不感兴趣,应该调用这个方法,以便文件指向下一个块的开始。

脚注

[1]“EA IFF 85”交换格式文件标准,Jerry Morrison,Electronic Arts,1985年1月。