文件结构

总体结构

一个标准的 flac 音频文件应当包含以下三个结构:

  • 文件头
  • 元数据块区域
  • 音频帧区域

上述三种结构在 flac 音频文件中顺次排序,一个结构结束后紧接下一个结构。
flac 中的所有数值,若无特别说明,都是无符号整型数值,占多个字节的数值按高位字节序(大端序)读取。

文件头

flac 文件的文件头仅包含一段由4个字节的 ASCII 码组成的标志“fLaC”,用16进制数据表示为:

66 4C 61 43

元数据块区域

元数据块区域包含用于描述 flac 音频流的信息以及一些附属的信息,其中的信息以不同类型的块(block)进行记录,称为“元数据块(metadata block)”,一个块结束后紧接着下一个块。
目前共有7种官方支持的元数据块类型:

  • 流信息:包含关于整个音频流的信息,如采样率、通道数、采样总数等。
  • 填充块:此类块中的数据没有任何意义,通常用于修改元数据时快速填充空余的位置而无需调整整个文件的大小。
  • 应用程序数据:用于记录第三方程序的数据。
  • 定位表:保存快速定位点,用于在音频流中快速定位。
  • 标签信息:用于记录音频作品相关的信息,如:演唱者、专辑、发布日期等。
  • 索引表:记录音频分轨信息。
  • 图片:包含音频相关的图片,通常用于保存音频封面。

上述类型中,“流信息”类型是 flac 文件中必须拥有的元数据块,而且必须是元数据块区域中的第1个块。除“流信息”类型之外的其他类型元数据块都不是必须的。
一个元数据块的数据结构如下:

部分 大小 说明
头部 是否是最后一个块 1字节 1位 0:不是最后一个块
1:是最后一个块
块的类型 7位 0:流信息
1:填充块
2:应用程序数据
3:定位表
4:标签信息
5:索引表
6:图片
数据的大小 3字节(24位) 头部后面所跟的数据的大小,不包括头部,单位是字节
数据 头部中“数据的大小”字段规定的大小 与“块的类型”一项相符的数据,各类元数据块的数据结构会在之后说明

除表中列出的元数据块类型外,数值7~126所对应的类型都是保留类型,127这个数值由于会产生和同步码相同的序列所以禁止使用,不应当在 flac 文件中使用这些类型的元数据块。
由于元数据块头部“数据的大小”字段只有24位,因此最大能容纳的数据大小为16777215字节,约15.9MB。
对于那些非必须的元数据块,解码器可以根据头部中指示的大小跳过元数据块的数据内容,而不必读取其数据,且不会影响到音频的解码。
解码器可以根据元数据块头部的“是否是最后一个块”部分来判断当前块是否最后一个元数据块,从而在处理完最后一个元数据块后进入下一个阶段。

流信息块数据格式

流信息块记录有音频流的基本信息,这些信息可以供程序在不解码音频流的情况下快速读取,某些情况下解码音频帧时也会需要从流信息块读取信息。
流信息块的数据大小是固定的,大小为34字节(272位),其结构如下:

部分 大小 说明
最小分块大小 16位 原始数据分块中最小分块的采样数,有效值:16~65535
最大分块大小 16位 原始数据分块中最大分块的采样数,有效值:16~65535
若该值和最小分块大小相等,则表示是固定分块大小的数据流
最小音频帧大小 24位 数据流中最小音频帧的大小,单位是字节,0表示未知
最大音频帧大小 24位 数据流中最大音频帧的大小,单位是字节,0表示未知
采样率 20位 采样率,单位是赫兹(Hz)
由于音频帧限制,实际最大值为655350,此值不能为0
通道数 3位 声道数量-1
flac支持1~8个声道
采样深度 5位 采样深度-1位
flac支持4~32位采样深度,目前的编码器和解码器最高仅支持24位
总采样数 36位 数据流中单个通道的总采样数,0表示未知
MD5签名 128位 未经编码的音频数据的MD5签名,用于校验音频数据中是否存在错误

填充块数据格式

填充块的数据大小必须与其头部中的“数据的大小”信息一致,单位是字节,可以是16777215字节以内的任意大小。填充块中的数据必须是全部为0的二进制序列。

应用程序数据块数据格式

部分 大小 说明
应用程序ID 32位(4字节) 用于区分此块是哪一个应用程序的数据的标识符
该ID由 flac 开发组织 管理,若想使用某一个 ID 需要申请注册
可以访问 https://xiph.org/flac/id.html 查看目前有哪些 ID 已被注册使用
应用程序数据 块数据大小-4字节 第三方应用程序的数据

定位表块数据格式

部分 大小 说明
定位点 目标帧首个采样的序号 64位(8字节) 目标帧中第一个采样的序号
0xFFFFFFFFFFFFFFFF 表示这是一个占位点
目标帧偏移量 64位(8字节) 目标帧头部相对于第一帧头部的偏移量,单位是字节
占位点没有这一部分
目标帧采样数 16位(2字节) 目标帧包含的采样的数量
占位点没有这一部分
更多定位点 同上 定位点的数量没有限制
定位点不能重复,以采样序号来区分,占位点除外
定位点必须按采样序号升序排列
因上述原因,所有占位点必须排在定位表最后

标签信息块数据格式

标签信息块是 flac 用于存储音乐信息的标准方式,数据采用 Vorbis Comment 标准。
此数据块中的长度信息使用低位字节序(小端序)表示。

部分 大小 说明
编码器标识 编码器标识长度 32位(4字节) 其后编码器标识的长度
编码器标识是标签信息数据块里的第一个字段,也是必需的字段
编码器标识 编码器标识长度 表示编码器标识的字符串,可以随意填写,使用 UTF-8 编码
自定义标签 标签内容长度 32位(4字节) 其后标签内容的长度
标签内容 标签内容长度 自定义标签的字符串,使用 UTF-8 编码,使用如下键值对格式:
标签名=标签值

自定义标签的个数没有限制,标签名可以是随意的

更多自定义标签 同上 标准的标签:
TITLE:作品名/曲名
VERSION:版本,标识同一作品/歌曲的不同版本,例如歌曲的混音版本
ALBUM:专辑,歌曲所属的专辑的名称
TRACKNUMBER:轨道编号,歌曲在其所属的专辑的编号
ARTIST:艺术家,作品的创作者,如:歌手、作曲者、朗读者
PERFORMER:乐曲演奏者,如:指挥、乐团、电子音乐的作曲者
COPYRIGHT:音频的版权,例:Copyright 2021 BSPR0002
LICENSE:许可信息,如:“保留所有权利”、许可证的URL
ORGANIZATION:制作该音频的团体(即录制公司)
DESCRIPTION:对音频内容的简短描述
GENRE:流派,对音乐体裁的简短说明
DATE:音频录制日期
LOCATION:录制音频的地区
CONTACT:音频创作者的联系方式
ISRC:音频的 ISRC 编号(国际标准音像制品编码)

索引表块数据格式

当一个 flac 文件中包含多个音轨时,可以使用索引表创建快速定位到音轨的点。

部分 大小 说明
媒体目录编号 128字节 媒体目录编号,由 ASCII 码可打印字符(0x20~0x7e)组成
若不足128字节,应用空字符(0x00)在后方补足
引入轨道采样数 64位(8字节) 音频第一个采样到第一个音轨的第一个索引的采样数
如果音频没有录入引入轨道,或者音频不是从 CD 提取的,则此项应为0
是否是标准 CD 1位 1:表示此表对应一张标准 CD
0:表示此表不对应标准 CD
保留区域 2071位(258字节+7位) 保留区域,此区域所有数位必须为0
音轨总数 8位(1字节) 音频中音轨的数量,最小为1
标准 CD 音频最大音轨数为100
音轨 音轨偏移量 64位(8字节) 音轨第一个索引相对于音频开始处的偏移量,单位是采样
在标准 CD 音频中,此数必须能被588整除
音轨编号 8位(1字节) 音轨的轨道编号
索引表中的最后一个轨道是引出轨道,该轨道的轨道编号必须是170或255
音轨 ISRC 96位(12字节) 音轨的 ISRC 编号,由12字节的 ASCII 码数字和字母字符组成
12字节全为空字符(0x00)表示此轨道没有 ISRC 编号
轨道类型 1位 0:表示这是一个音频轨道
1:表示这是一个非音频轨道
预加重标记 1位 0:表示不预加重
1:表示预加重
保留区域 110位(13字节+6位) 保留区域,此区域所有数位必须为0
索引数量 8位(1字节) 轨道包含的索引的数量
除引出轨道外,索引数量最少为1
引出轨道不能有任何索引,即数量为0
标准 CD 音频中,单轨索引数量最大为100
索引 索引偏移量 64位(8字节) 索引相对于音轨开始处的偏移量,单位是采样
在标准 CD 音频中,此数必须能被588整除
索引编号 8位(1字节) 索引在音轨中的编号,单个轨道中的索引编号不能重复
在标准 CD 音频中,轨道第一个索引的编号必须是0或1,此后每个索引的编号必须+1
编号为0的索引表示该轨道前预留间隙的位置
保留区域 24位(3字节) 保留区域,此区域所有数位必须为0
更多索引 同上
更多音轨 同上

图片块数据格式

部分 大小 说明
图片关系 32位(4字节) 描述图片与音频文件的关系
0:其他
1:32×32大小文件图标(仅支持PNG)
2:其他图标
3:媒体封面
4:媒体封底
5:宣传图
6:媒体图像(如:CD侧封)
7:艺术家照片
8:演唱者照片
9:指挥者照片
10:乐队、剧团照片
11:作曲家照片
12:作词者照片
13:录音场地照片
14:录音过程照片
15:表演过程照片
16:相关视频截图
17:万彩图
18:印象图
19:艺术家、艺术团队 logo
20:发行商、工作室 logo
MIME 类型字符串长度 32位(4字节) 其后表示图片 MIME 类型的字符串的数据长度,单位是字节
MIME 类型字符串 MIME 类型字符串长度 表示图片 MIME 类型的字符串
描述字符串长度 32位(4字节) 其后用于描述图片的字符串的数据长度,单位是字节
描述字符串 描述字符串长度 描述图片的字符串,使用 UTF-8 编码
宽度 32位(4字节) 图片的宽度,单位是像素
高度 32位(4字节) 图片的高度,单位是像素
色位深度 32位(4字节) 图片的色位深度,单个像素表示颜色使用的总位数
索引图颜色数量 32位(4字节) 使用的图片是索引图时,表示其使用的颜色数量
0 表示图片不是索引图
图片数据长度 32位(4字节) 其后图片数据的长度,单位是字节
图片数据 图片数据长度 图片数据

音频帧区域

音频帧块区域是 flac 中真正存放音频编码数据的区域,此区域是 flac 中的最后一个区域,文件的末尾即是该区域的结束。
flac 将原始的音频数据分成一个个块(下文称“分块”),并单独压缩编码为一个个帧。flac 有多种编码方式,编码器通过合理的策略对不同的分块使用合适的编码方式来达到压缩的效果。
每一个帧都包含如下部分:

部分 说明
帧头 记录帧的相关信息
子帧 帧中每个通道的数据,一个通道对应一个子帧
对齐填充 填充 0,以对齐到一个字节
帧尾 除去帧尾部分所有数据的 CRC-16 校验信息

帧头

部分 大小 说明
同步码 14位 固定二进制序列 11111111111110,表示帧的开始
保留 1位 固定值 0,用于与 MPEG 音频帧的头15位进行区分
分块策略 1位 表示对原始音频进行分块的方式的数值
0:固定分块大小
1:可变分块大小
此项会对之后的字段产生影响
此项在所有的帧中必须相同
分块大小 4位 此帧对应音频分块的单个通道内的采样数,此项并非直接表示采样数
0:保留值
1:192个采样
2~5:可用表达式 576×2x-2 算得采样数(576,1152,2304,4608)
6:从帧头“自定义分块大小”部分取8位二进制数作为采样数
7:从帧头“自定义分块大小”部分取16位二进制数作为采样数
8~15:可用表达式 256×2x-8 算得采样数(256,512,1024,2048,4096,8192,16385,32768)
此项会对之后的字段产生影响
采样率 4位 此帧的采样率,此项并非直接表示采样率
0:从流信息元数据块获取
1:88.2kHz
2:176.4kHz
3:192kHz
4:8kHz
5:16kHz
6:22.05kHz
7:24kHz
8:32kHz
9:44.1kHz
10:48kHz
11:96kHz
12:从帧头“自定义采样率”部分取8位二进制数,以 kHz 为单位作为采样率
13:从帧头“自定义采样率”部分取16位二进制数,以 Hz 为单位作为采样率
14:从帧头“自定义采样率”部分取16位二进制数,乘10后以 Hz 为单位作为采样率
15:无效值
此项会对之后的字段产生影响
通道分配 4位 通道的数量以及通道对应哪个声道,以下列表会在每一项后方注明声道的顺序
0:1通道(单声道)
1:2通道(左右立体声);左,右
2:3通道(3声道);左,右,中
3:4通道(4声道);左前,右前,左后,右后
4:5通道(5声道);左前,右前,中前,左后,右后
5:6通道(5.1声道);左前,右前,中前,LFE,左后,右后
6:7通道(6.1声道);左前,右前,中前,LFE,中后,左后,右后
7:8通道(7.1声道);左前,右前,中前,LFE,左后,右后,左中,右中
8:2通道(左侧立体声);左声道,副声道
9:2通道(右侧立体声);右声道,副声道
10:2通道(中部立体声);中声道,副声道
其他:保留
采样深度 3位 每个采样的位数,此项并非直接表示采样深度
0:从流信息元数据块获取
1:8位
2:12位
3:保留值
4:16位
5:20位
6:24位
7:保留值
保留 1位 固定值 0,无实际用途
帧编号 8~56位(1~7字节) 按 UTF-8 规范编码的数字
该项的内容与长度取决于分块策略
当分块策略为0时,该项表示这是第几个帧,最多使用6字节,转换后的数字最多有31个二进制位
当分块策略为1时,该项表示该帧第一个采样的序号,最多使用7字节,转换后的数字最多有36个二进制位
自定义分块大小 0~16位(0~2字节) 此帧对应音频分块的单个通道内的采样数-1
该项的长度取决于分块大小字段的数值
当分块大小字段为不为6或7时,该项长度为0,即没有该字段
当分块大小字段为6时,该项长度为8位
当分块大小字段为7时,该项长度为16位
自定义采样率 0~16位(0~2字节) 此帧的采样率
该项的长度取决于采样率字段的数值
当采样率字段不在12~14范围内时,该项长度为0,即没有该字段
当采样率字段为12时,该项长度为8位
当采样率字段为13或14时,该项长度为16位
CRC-8 8位(1字节) 帧头部分除此字段外所有内容的CRC-8校验信息

子帧

子帧部分会包含多个子帧,子帧的数量需要通过帧头部分的“通道分配”字段判断,有多少个通道就有多少个子帧,一个子帧紧接下一个子帧。
每个子帧都包含如下部分:

部分 说明
子帧头 记录子帧的相关信息
数据 子帧的数据目前有四种类型,对应 flac 中不同的编码方式
每个子帧会在其中选择一个进行编码
所有子帧的类型:

  • CONSTANT
  • VERBATIM
  • FIXED
  • LPC

各种子帧会在之后说明

子帧头

部分 大小 说明
填充位 1位 固定值 0,避免出现与同步码相同的序列
子帧类型 6位 表示该子帧属于哪种类型的数值
0:CONSTANT
1:VERBATIM
8~12:FIXED,值需要满足表达式(7+预测器阶数)
32~63:LPC,值需要满足表达式(31+预测器阶数)
其他:保留
无用采样位数 (1+x)位 子帧每个采样中有多少位是实际没有用到的

该字段第1位为 0 时,表示没有无用的采样位,x=0

该字段第1位为 1 时,表示有无用的采样位,x=无用的采样位数,
第1位后方要跟一段由(x-1)个 0 和1个 1 组成的二进制序列,
该序列的长度即是无用的采样位数

例:
没有无用采样位;1位;0
有1位无用采样位;2位;11
有2位无用采样位;3位;101
有3位无用采样位;4位;1001
有4位无用采样位;5位;10001

根据此项可以推断子帧实际使用的采样位数:采样深度-无用采样位数

CONSTANT 子帧

CONSTANT 子帧只包含一个未编码的采样,表示子帧中所有的采样都是相同的。

部分 大小 说明
采样固定值 帧采样深度 原始子分块中采样的固定值,其长度为帧的采样深度
例如帧的采样深度是16位,则此项的长度也是16位

VERBATIM 子帧

VERBATIM 子帧即原样子帧,其中的数据没有经过编码。使用这种子帧通常是因为没有找到对原始子分块有效的压缩方式,故而保持原样。

部分 大小 说明
原样数据 帧采样深度×帧分块大小 原始子分块的原样数据,没有经过编码

对齐填充

部分 大小 说明
填充 0~7位 对子帧末尾不足一个字节的数据进行填充以实现字节对齐
若前方刚好满一个字节则不需要对齐

帧尾

部分 大小 说明
CRC-16 16位 除去帧尾部分所有数据的 CRC-16 校验信息
包括帧头、子帧、对齐填充

本文对音频帧方面的内容尚未编写完成。
原资料:xiph.org

flac 音频格式标准相关推荐

  1. 如何更改音频格式?分享这几个简单的转换方法给你

    音频剪辑这方面的工作,在如今这个短视频行业发展火热的年代里,可以说是非常重要的一个部分,毕竟只有合适的音频才能够更加吸引大家观看的兴趣,所以说这是一项非常重要的工作,但是很多小伙伴在日常寻找音频素材的 ...

  2. flac格式转换mp3格式_MP3,FLAC和其他音频格式之间有什么区别?

    flac格式转换mp3格式 Digital audio has been around a very long time so there's bound to be a plethora of au ...

  3. 多媒体音频格式解析WMA WAV OGG AAC APE FLAC

    无论是MP3还是MP4,甚至手机和多媒体DC,产品所支持的各种格式往往让人眼花缭乱.特别是对于刚上手的新手玩家来说,各种格式都有哪些特性,在实际 使用当中有多少格式实用或者必须,其实有很多方面需要我们 ...

  4. 音频格式详解 CD WAV MP3 WMA MIDI RM RA OGG VOF AAC M4A APE FLAC TAK TTA MV RealAudio AIFF AU

    以下是常见音频文件格式的特点. 要在计算机内播放或是处理音频文件,也就是要对声音文件进行数.模转换,这个过程同样由采样和量化构成,人耳所能听到的声音,最低的频率是从20Hz起一直到最高频率20KHZ, ...

  5. MP3、AAC、WMA、Ogg、MPC、WAV、FLAC、APE、WV、CD、MIDI、RealVideo等音频格式解析及对比

    音频格式详解 无论是随身听还是手机或者是多媒体DC,产品支持的音频格式多样,然而它们都有各自的特性.我们在应用中选择的时候必须考虑到各种格式的适用场合,这要求我们对很多方面有个系统的了解. 有损压缩格 ...

  6. 【FFmpeg】ffmpeg 命令查询二 ( 比特流过滤器 | 可用协议 | 过滤器 | 像素格式 | 标准声道布局 | 音频采样格式 | 颜色名称 )

    FFmpeg 系列文章目录 [FFmpeg]Windows 搭建 FFmpeg 命令行运行环境 [FFmpeg]FFmpeg 相关术语简介 ( 容器 | 媒体流 | 数据帧 | 数据包 | 编解码器 ...

  7. 如何把FLAC音频转换成MP3格式

    FLAC是可以保留声音原本音质的音频解码格式,但它会占用大量的硬盘空间,并且大多数MP3播放器都不支持播放这种格式的音乐.所以我们有时候会将FLAC文件转换成MP3文件,这样不仅可以节省很多空间,而且 ...

  8. Matlab 音频格式转换(wav,ogg,flac,au,aiff,aif,aifc,mp3,m4a,mp4 互转)

    欢迎转载,但请一定要给出原文链接,标注出处,支持原创! 谢谢~ https://blog.csdn.net/qq_29225913/article/details/105445028 目录 1.目标及 ...

  9. EDIUS 视音频制作标准教程(第2版)21堂课高清1280X720 25Pmp4格式 含同步素材 edius初学者必备装备

    EDIUS 视音频制作标准教程(第2版)21堂课高清1280X720 25Pmp4格式 含同步素材 edius初学者必备装备 肖一峰,作为Grass Valley 公司EDISU产品工程师,有大量机会 ...

最新文章

  1. static、final、abstract基本作用
  2. DCMTK:测试衍生图像FG类
  3. oracle分区交换有啥好处,分区交换的速度为什么快?
  4. 优化Linux下的内核TCP参数来提高服务器负载能力
  5. linux下线程绑定内核,多线程 – 无法将内核线程绑定到CPU
  6. [css] 有用过scss和sass吗?说说它们之间的区别是什么?
  7. mysql存储引擎的区别_Mysql的两种存储引擎以及区别
  8. php 10060,远程连接mysql 10060错误
  9. python 删除文件 通配符_python 实现删除文件或文件夹实例详解
  10. 显示浏览器表单输入框的缓存密码
  11. 如何通过Excel文件批量生成PDF417二维码
  12. 2022,微博稳了吗?
  13. emd经验模态分解 matlab,经验模态分解(EMD)在地球物理资料中的应用(附MATLAB程序)...
  14. iredmail mysql 密码_iRedMail 批量创建用户 (repost)
  15. Redhat、Fedora、CentOS、OEL之间的关系与不同。
  16. 《当下的启蒙》的概述和精华
  17. 工简教育:消防工程师证书的用途
  18. 串行同步通讯-I2C
  19. linux编辑文本工具栏,LINUX-Gdit文本编辑器.ppt
  20. 实用Macbook软件系列

热门文章

  1. Brightcove推出业务连续性套件,以帮助安全地管理业务沟通
  2. 计算机三级刷分,培训项目
  3. [Linux 基础] -- Linux 内核中的 MFD 子系统
  4. 胡进勤:精密空调组网群控功能介绍
  5. Android中拍照(相册中选择)并上传图片功能(包括动态获取权限)
  6. 艾永亮:产品MVP到底该怎么做?
  7. hive 十六进制转十进制_[转] Hive 内置函数
  8. Python状态机(transitions模块)
  9. 【Unity】解决IL2CPP打包报错Building xxx\ei6vj\wncp_y_vm6.lump.obj failed with output: qtky_vm6.lump.cpp
  10. 网络安全等级保护制度2.0(简称“等保2.0”)学习笔记