关于CAF文件

作者: ibingewin | 来源:发表于2017-06-29 15:38 被阅读342次

    写在前面

    在查看苹果音频相关文档时,涉及到CAF文件,不太了解,就参考了一下苹果的官方说明文档 Apple Core Audio Format Specification 1.0

    CAF File Overview (文件概览)

    该文档提供了理解和使用苹果的Core Audio Format(CAF)文件所需要的背景知识

    CAF文件的优点

    苹果的 Core Audio Format (CAF)文件是存储、操作数字音频的一种灵活,艺术级的文件格式。在OS X v10.4OS X v10.3QuickTime 7iOS5.0之后开始支持,CAF文件具有 高性能、高灵活性,可扩展的特点。

    • 文件大小不受限制:像 AIFFAIFF-CWAV等文件格式,文件大小都有限制,不得超过4GBCAF文件是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

    了解更多关于CAF Chunk types

    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

    相关文章

      网友评论

        本文标题:关于CAF文件

        本文链接:https://www.haomeiwen.com/subject/ydnmcxtx.html