FLAC、ALAC是目前常用的无损压缩音频格式。
1、FLAC
FLAC(Free Lossless Audio Codec),是一种免费开源的无损音频编码,于1999–2001 年发布。它是一种无损压缩编码,输入是LPCM数据,解码后可以100%还原原始的PCM数据,无音质损失。FLAC的压缩率为40%~60%。
FLAC的编码过程包括5个主要步骤:
1)音频数据分块
将立体声PCM音频数据流,分割为若干个连续的、独立的音频数据块。其目的是将长时音频信号拆解为多个信号特征相对稳定的短时片段,为提升预测编码的效率创造条件。
数据分块对块大小有明确的约束机制,FLAC规定单个块的采样点数量最小为16个,最大为65535个。分块策略会影响影响压缩效率,如果块大小设置得过小,会导致帧头数量大幅增加,消耗过多的存储资源,反而抵消了压缩带来的体积优势;如果块大小设置得过大,则块内音频信号的稳定性会下降,降低后续预测编码的精度。在实际工程应用中,编码器通常会根据音频信号的特性,动态选择最优的块大小,以实现最优的压缩效果。例如 对于音乐这类中低频信号占比高的音频,通常会采用较大的块,减少帧头的资源占用;对于语音这类变化相对频繁的音频,则会改用较小的块,提升预测编码的精度。FLAC 文件的分块模式(采用固定块大小还是动态块大小),会在文件的头部进行标注。
2)声道去相关
这一步是利用多声道音频的声道间的相关性,来消除冗余信息。
以立体声为例,由于立体声的左右声道通常会拾取同一声源的信号,只是在声音定位、延迟时间上存在细微差异,因此左右声道的信号波形、幅度特征往往高度相似,这一特性被称为 “声道间信号的相关性”。声道去相关就是利用这一相关性,用更精简的数据组合来表示原始的多声道信号,从而降低数据量。
声道去相关支持四种不同的转换模式,编码器会根据音频信号的实际特征,自主选择最优的转换模式:
※ 独立模式:不做任何声道数据转换,左右声道或多声道数据被分块独立编码。这一模式适用于左右声道差异极大的特殊立体声,例如某些实验电子音乐、左右声道完全独立的特殊测试音频,或者多声道非立体声内容。
※ Mid-Side模式:这是最常用的转换模式,其核心逻辑是,将原始的左、右声道信号,重新编码为Mid信号和 Side信号。其中,Mid信号是将左/右声道的信号相加后右移一位,用来表示双声道的平均信号;Side信号是用左声道信号减去右声道信号,用来表示两个声道的信号差异。在解码阶段,Mid和Side 信号可以被精准还原为原始左、右声道数据。右移 1位的操作,不会导致损失数据精度,因为Side信号的奇偶性,可以辅助恢复Mid信号丢失的最低位。
※ Left-Side模式:不直接对右声道数据进行编码,而是将左声道信号与左右声道的差信号进行组合编码。该模式适用于左声道信号占比更高的音频内容,例如某些人声仅集中在左声道的特殊立体声素材。
※ Right-Side模式:与Left-Side模式类似,区别在于其组合的是右声道信号和左右声道差信号。该模式适用于右声道信号占比更高的音频内容,例如某些人声仅集中在右声道的特殊立体声素材。
在实际的工程应用中,FLAC编码器会为每个音频数据块选择合适的声道转换模式。通过对当前块的左右声道信号进行快速预分析,自动选择压缩效率最高的一种声道数据组合方案,以实现最优的压缩效果。
3)线性预测LPC
经过声道去相关处理后的音频数据,仍存在一定的信号冗余。音频信号的相邻采样点之间,存在着很强的信号相关性,这是音频压缩技术可以利用的核心空间。线性预测编码就是用来去除这一维度冗余的关键技术,是决定压缩效率的核心环节。
在处理每个子块时,编码器会通过数学分析,为当前子块的信号特征构建一个专属的预测器,预测器的核心就是是一组能够描述信号波形变化规律的预测系数。在编码阶段,预测器会利用子块中先前的若干个采样点,计算出下一个采样点的预测值;然后用实际采样点的真实值减去这一预测值,得到一个 “残差信号”。残差信号记录了预测值与真实值之间的误差。在解码阶段,解码器可以利用存储的预测参数和残差信号,精准地还原出原始采样值。由于预测参数的存储空间,远小于原始信号的存储空间,这样就可以显著压缩数据体积。
FLAC提供了两类预测器,以覆盖不同的音频信号特征场景。一类是固定预测器,其预测系数的模型参数是全局固定的,无需在编码流中额外存储,适合处理相对平稳的音频信号;另一类是灵活的线性预测器,其预测系数会根据每个子块的信号特征实时计算,适合处理变化幅度较大的复杂音频信号。
预测阶数决定了参与预测的历史采样点的数量,FLAC支持的最高预测阶数为12阶,即最多可以用当前采样点之前的12个历史采样点,来预测当前采样点的数值。在实际编码过程中,编码器会根据子块的信号特征,在1阶到12阶之间自动选择最优阶数,在保证预测精度的同时,将计算复杂度控制在合理范围内。
4)残差编码
经过预测编码环节处理后,得到的残差信号的数值,通常会比原始信号采样值小很多,但其分布仍存在一定的随机性,直接对其存储,仍会浪费较多的空间。FLAC通过对残差信号进行针对性的熵编码,可以进一步压缩其存储空间。
FLAC采用Rice编码作为熵编码的技术方案,Rice编码是Golomb编码的一个子集,其技术特点是对 “数值接近零的整数数据” 具有很高的编码效率,恰好匹配了经过预测编码处理后的残差信号特征。Rice编码的实现逻辑简单,解码过程仅需整数运算,这与 FLAC 低解码复杂度”的核心设计目标高度匹配。
在编码阶段,编码器会根据当前子块的残差信号的数值分布特征,计算出一个最优的 Rice参数,这个参数是将残差信号的采样值拆分为 “商” 和 “余数” 两个部分:其中,商部分以无编码的形式存储,余数部分则以二进制编码的形式存储。由于Rice编码只能处理无符号整数,残差的有符号数值通过 “ZigZag编码” 转换为无符号整数,进一步提升编码效率。在解码阶段,这一过程会被反向执行,将商和余数重新组合为原始的残差信号采样值。
此外,为了适配残差信号在不同时间段的数值分布变化,FLAC还支持将子块的残差信号,进一步划分为多个独立的残差分区,每个分区都可以根据自身的数值分布特征,选择最优的Rice参数,保证了编码的整体效率。
5)数据帧封装与校验
经过上述步骤处理后的压缩数据,会被重新封装到FLAC专用容器格式中,即将所有编码数据、辅助参数及校验信息等以合理的结构组织起来,便于解码器识别和处理。
每个 FLAC 文件的封装结构,由三个核心部分组成:
※ 文件标识头:位于文件的起始位置,是一个长度4字节的固定字符串 “FLAC”;
※ 元数据块:存储解码音频所必需的基础技术参数,以及可选的辅助媒体信息。其中,必须包含的基础技术参数,主要包括声道数、采样率、位深度、总采样帧数等;可选的辅助媒体信息,主要包括曲目名称、专辑名称、艺术家信息、专辑封面图片、播放间隙的无缝回放信息等。元数据块可以包含多个子块,支持灵活扩展,便于第三方工具嵌入更多的自定义信息。
※ 音频帧序列:由多个独立的音频帧组成,每个音频帧对应一个经过压缩处理的音频数据块。音频帧是FLAC文件中的最小解码单元,包含了帧头、压缩后的残差数据、CRC-16 校验码。其中,帧头存储了当前帧的块大小、声道模式、预测编码模式、Rice 参数等关键解码信息;CRC-16 校验码则用于解码器在读取帧数据时,验证帧数据的完整性,避免因数据损坏导致解码错误。
FLAC在在线音乐平台与流媒体服务、专业音频制作与后期处理、音频档案保存、消费类音乐设备等方面都有广泛的应用。
2、ALAC
ALAC (Apple Lossless Audio Codec),是苹果公司开发的一种无损音频编解码技术,与FLAC类似,它同样采用了 “线性预测编码+自适应熵编码” 的多级压缩技术方案,压缩率为40%~60%。
2004年4月苹果公司正式发布ALAC音频编解码技术,一直到2011年,ALAC 的技术源码完全不对外公开,编解码方案仅通过苹果的专属开发工具包开放给第三方,生态覆盖范围被严格限制在 iPod、iTunes、Mac 等少数苹果产品内,几乎没有任何第三方软硬件支持。2011年10月,苹果正式将ALAC的源码以Apache License 2.0协议的形式对外开放,开发者可以免费将ALAC的编解码能力集成到自己的产品中,无需支付专利费,也不受苹果的技术限制。这一策略直接推动了ALAC的生态扩张,从2011年底的iTunes 10.5版本开始,苹果全面开放了ALAC与iTunes音乐管理功能的底层对接;到了2021年,Apple Music 推出了无损音质服务,将ALAC作为核心的编解码技术方案。
ALAC的编解码过程与FLAC高度相似,主要包括 音频数据分块、声道去相关、线性预测编码、残差编码、MP4 封装格式、文件帧封装与校验六个主要步骤。
1)MP4封装格式:
与FLAC采用专门的FLAC封装格式不同,ALAC的编码数据流被存储在标准的MP4格式容器中,这一容器的复用设计,是ALAC能够无缝适配苹果生态的关键技术支撑。
ALAC选择MP4容器的核心原因是,该格式已经在苹果生态的音视频场景中得到了广泛应用,这样苹果生态内的所有硬件、软件传输协议,都能直接识别和解析ALAC的封装结构,无需额外开发适配模块;在MP4容器中,ALAC音频数据流与采用AAC编码的音频流可以被存储在不同的音频轨中,进而在同一个MP4文件中,可以同时包含ALAC无损音轨与AAC有损音轨,便于不同网络带宽、不同播放设备的适配切换;在MP4容器的元数据中,ALAC编码的音频流会被标识为 “alac” 类型,并有专门的配置块存储解码必需的基础参数。
2)文件帧封装与校验
经过之前步骤处理后的各类压缩数据,会被重新封装到ALAC的专用格式中。每个ALAC 文件的封装结构,由三个核心部分组成:
※ 文件标识头:位于文件的起始位置,是一个长度为4字节的固定前缀,通常为0xFADEC0DE,解码器可以通过这个标识快速识别该文件的编码格式;
※ 元数据配置块:存储了解码音频所必需的基础技术参数以及可选的辅助信息。必须包含的基础技术参数,主要包括声道数、采样率、位深度、总采样帧数、每帧采样数等;可选的辅助媒体信息,主要包括曲目名称、专辑名称、艺术家、专辑封面、曲目流派、录音年代等,以标准的ID3标签格式存储;
※ 音频帧序列:文件中最大的部分,由多个音频帧组成,存储了经过前述步骤压缩处理后的完整音频数据。每个音频帧都以一个简短的帧头开始,帧头中存储了当前帧的关键解码信息,包括帧大小、采样数、位深度、声道数等;帧头之后,是经过熵编码压缩的残差数据;每个音频帧的末尾,还附加了CRC-16校验码,用于解码器在读取帧数据时,验证帧数据的完整性。
ALAC主要应用在基于苹果产品的生态中,在流媒体、音乐播放、专业音频处理等领域都有广泛的应用。
3、ALAC与FLAC对比
1)相同点:
都是基于线性预测编码+熵编码 的无损压缩技术方案;
都采用无损压缩技术,编码后的音频音质完全一致;
都支持最高32bit/384kHz的高解析度音频规格,支持的声道数最高都可以达到8声道;压缩率类似,都在40%-60%之间;
解码过程都只需要整数运算,计算资源开销都比较低。
2)差异点:
※ 生态与兼容性:ALAC的生态高度绑定苹果生态,所有苹果设备都对其提供了原生级的支持,无需额外安装插件;但在非苹果生态中,如安卓、Windows、Linux 等平台,其原生支持度非常有限,用户需要安装第三方编解码工具或播放器才能正常播放。同样的,FLAC在安卓、Windows、Linux 及各类嵌入式消费级音频设备上的原生支持度极高,但在苹果生态中,其原生支持性不佳。
※ 压缩效率:从实际测试效果来看,FLAC的压缩率略优于ALAC。在相同的编码参数下,对同一首CD音质的曲目进行处理后,FLAC格式文件的体积比ALAC格式的文件小10-30MB左右。这是因为FLAC采用了更复杂的预测编码方案,对音频信号的冗余度去除更彻底;
※ 封装格式:ALAC的编码数据流,被存储在标准的MP4格式容器中,复用了MP4的成熟封装结构;而FLAC采用的是专门的FLAC元数据容器,FLAC容器更适配流式传输场景,能在不影响音频播放的前提下,动态加载和更新元数据信息。







