关于CAF文件
写在前面
在查看苹果音频相关文档时,涉及到CAF文件,不太了解,就参考了一下苹果的官方说明文档 Apple Core Audio Format Specification 1.0
CAF File Overview (文件概览)
该文档提供了理解和使用苹果的
Core Audio Format(CAF)
文件所需要的背景知识
CAF文件的优点
苹果的 Core Audio Format (CAF)
文件是存储、操作数字音频的一种灵活,艺术级的文件格式。在OS X v10.4
、OS X v10.3
、QuickTime 7
、iOS5.0
之后开始支持,CAF文件具有 高性能、高灵活性,可扩展的特点。
-
文件大小不受限制:像
AIFF
、AIFF-C
、WAV
等文件格式,文件大小都有限制,不得超过4GB。CAF
文件是64位的,不受文件大小限制,一个标准的CAF
文件时长可以达到几百年; -
安全高效:像 AIFF和WAV文件,在写入时,当录制文件结束时,必须更新
数据头
中的文件大小
,一旦更新被打断,数据头没能及时更新,就会导致文件无效;或者是在每录制一个数据包,就更新一下数据头
,但这样效率低下。相反,在CAF
文件中,可以在文件末尾拼接新的音频数据,即使数据头
没有更新,也可以决定数据大小 -
支持多种数据格式:
CAF
文件只是对音频数据的封装,CAF
文件结构非常灵活,几乎可以用于任何类型的音频数据,未来,CAF
文件甚至可以存储任何数量的音频通道。 -
支持数据依赖:
CAF
文件中的元数据是通过一个count
值,来链接到音频数据。你可以用这个值来决定元数据什么时候依赖到音频数据,未来,甚至可以决定元数据写入后,什么以后音频数据发生变化。
CAF File Structure (文件结构)
CAF
文件由文件头
和语句块
组成。文件头
标识了文件的类型和CAF
的版本;语句块
由块头
和块数据
组成:块头
定义了语句块的类型和块数据的大小。每个语句块的类型都可以有自己的格式和属性。
每个CAF
文件都必须要有两个语句块:Audio Data chunk(音频数据块,包含音频数据)
和 Audio Description chunk(音频描述块,包含音频数据格式)
。
音频描述块必须是文件头后的第一个语句块,音频数据块可以在文件的任何其他位置,前提是数据区已确定。如果音频数据块的数据区未确定,块头的size设置为-1,该块必须在文件的最后位置,这样可以让你在块头size不可用的时候,也能决定数据区的大小
真正的音频是存储在音频数据块中,有一系列的音频包组成。音频包可以包含多种格式。
CAF文件还支持其他类型的语句块,这些语句块可以放在第一个块(音频描述块)和最后一个块(块头size为-1的坏块)之间的任何位置
Chunk Struncture(语句块结构)
每个语句块都由一个块头和一个数据区组成
块头包含两部分:
- 一个4字符编码:表示语句块类型
- 一个数字:表示语句块大小,单位是字节
语句块中的数据格式,由块类型决定,由很多部分组成,称之为fields,所有其他 fields,都是大端对齐
的
Packets,Frames,and Samples(包、帧、样本)
为了理解这些参数,需要理解下边4个概念
- Sample:样本--数字音频的一个通道
- Frame:音频帧--
- Packet:包--最小的单元块。对于线性的PCM(pulse-code modulated,脉冲编码调制)流数据,每一个包都只包含一帧,对于压缩过的音频格式,一个包的帧数取决于编码方式,例如:AAC的一个包表示1024个PCM帧,不同的格式,包的帧数不同
- Sample rate:采样率--一秒钟采集的完整样本的帧数
Types of Chunks(语句块类型)
Data Types(数据类型)
CAF文件中的所有fields,都是大端字节排序,音频数据可以是大端模式,也可以是小端模式,取决于数据格式。音频数据格式由音频描述块决定。
CAF File Header and Chunk Headers(CAF文件头和语句块头)
文件头,描述整个CAF文件;语句块头,描述对应的语句块
CAF File Header(CAF文件头)
每个CAF文件都有一个简单的头,即 CAFFileHeader 结构体
struct CAFFileHeader {
UInt32 mFileType;
UInt16 mFileVersion;
UInt16 mFileFlags;
};
-
mFileType:文件类型。必须是
caff
,可以认为只有 mFileType为caff的才是有效的CAF文件 - mFileVersion:文件版本。对于遵守这个说明的CAF文件,版本号必须是1,如果苹果发布了这个说明的修订版本,该值应该大于1
- mFileFlags:苹果的保留字段,对于CAF v1的文件,该值必须是0,可以忽略这个值,只要文件类型和版本有效,就可以认为该文件有效
CAF Chunk Header(CAF语句块头)
每一个语句块都有一个块头,即 CAFChunkHeader结构体
struct CAFChunkHeader {
UInt32 mChunkType;
SInt64 mChunkSize;
};
-
mChunkType:语句块类型。由4个字符组成,该字符为
'a-z'
、' '
、'.'
,可以自定义,自定义时至少要使用一个在系统字符范围外的一个字符 - mChunkSize:数据区大小,单位字节。只是不包含块头的大小,如果不是特别的块类型,mChunkSize必须是有效的,如果数据类型未知,则设为-1
Required(必须的语句块)
每一个CAF文件都必须包含下列语句块
- Audio Description chunk:描述文件的音频数据格式,必须紧跟在CAF文件头之后,更多关于 Audio Description chunk
- Audio Data chunk:包含文件的音频数据,如果数据大小未知,必须放到文件的最后;如果文件大小已知,则可以放在Audio Description chunk之后的任何位置更多关于 Audio Data chunk
- Packet Table chunk: 如果音频包的大小是变化的,则文件还必须有一个 Packet Table chunk,该值记录每一个包的大小更多关于 Packet Table chunk