1. 简介
FLAC是受支持最快且最广泛支持的无损音频编解码器,唯一一种是非专有的,不受专利影响,具有 开源 参考实现,具有良好的文档格式和API,并具有几种其他独立实现。
2. 技术特点
- 无损压缩:被编码的音频(PCM)数据没有任何信息损失,解码输出的音频与编码器的输入的每一个字节都是一样的。每个数据帧都有一个当前帧的16-bit CRC校验码,用于监测数据传输错误。对整段音频数据,在文件头中还保存有一个针对原始未压缩音频数据的MD5标记,用于在解码和测试时对数据进行校验。
- 灵活的压缩策略:与libflac使用是“质量”的参数,该参数变化从0(最快)至8(最小)。虽然在压缩过程(压缩文件总是完美的“无损”表示的原始数据)。涉及速度和容量之间的折衷,解码过程中始终是相当快的,而不是非常依赖于压缩
- 快速:FLAC更看重解码的速度。解码只需要整数运算,并且相对于大多数编码方式而言,对计算速度要求很低。在很普通的硬件上就可以轻松实现实时解码。
- 硬件支持:由于FLAC提供了免费的解码范例,而且解码的复杂程度低,所以FLAC是目前少数获得硬件支持的无损压缩编码之一。(APE格式也有少数硬件支持)
- 可以流化:FLAC的每个数据帧都包含了解码所需的全部信息。解码当前帧无需参照它前面或后面的数据帧。FLAC使用了同步代码和CRC(类似于MPEG等编码格式),这样解码器在数据流中跳跃定位时可以有最小的时间延迟。
- 可以定位:FLAC支持快速采样精确定位。这不仅对于播放有益,更使得FLAC文件便于编辑。
- 富于弹性的metadata:可以定义和实现新类型的metadata数据块,而不会影响旧的数据流和解码器的使用。目前已有的metadata类型包括tag,cue表,和定位表。已经注册的应用程序可以定义自己专用的metadata类型(这一点与MIDI标准相似)。
- 非常适合于存档应用:FLAC是一个开放的编码格式,并且没有任何数据的损失,你可以将它转换为你需要的任何其他格式。除了每个数据帧的CRC和MD5标记对数据完整性的保障,flac(FLAC项目提供的命令行方式编码工具)还提供了一个verify(校验)选项,当使用该选项进行编码的时候,编码的同时就会立即对已编码数据进行解码并与原始输入数据进行比较,一旦发现不同就会退出并且报警提示。
- 便于对CD进行备份:FLAC有一个cue表,表内的metadata数据块用于保存CD的内容列表和所有音轨的索引点。你可以将一张CD保存到一个单一文件,并导入CD的cue表格,这样一个FLAC文件就可以完整地记录整张CD的全部信息。当你的原来的CD损坏的时候,你就可以用这个文件恢复出与原来一模一样的CD副本。
- 抗损伤:由于FLAC的帧结构,当数据流损坏时,数据损失会被限制在受损的数据帧之内。一般只会丢失很短的一个片段。而很多其他无损音频压缩格式在遇到损坏时,一个损坏就会造成后面所有数据丢失。
3. 解码原理
解码器主要由五个模块组成,如下图所示。
一、解码头信息,码流输入解码器,解码出码流中的比特率、采样率等信息,并将残差信号编码码流输入到下一步的嫡解码器
二、嫡解码,嫡解码器依据上级传来的码流信息以解码残差信号
三、解码,由残差信号和预测系数恢复原始音频信号
四、立体声处理,由码流中的声道设置信息恢复立体声的左右声道信号
五、格式化输出,将左右声道按需求格式输出。
3.1 LPC
线性预测(linear prediction)是指用P个已知的样值的某种线性组合来预测未知的样值。多用于语音信号处理中,用前面的采样值的线性组合来估计离散时间域信号。在数字语音处理中,线性预测经常成为线性预测编码(LPC),可以作为滤波器理论的一部分。
假设已知n时刻前p个样点的语音信号值为x(n-1), x(n-2)…, x(n-p), 则x(n)的估计值为:
3.2 Golomb
对于任一待编码的非负正整数N,Golomb编码将其分为两个部分:所在组的编号GroupID以及分组后余下的部分,GroupID实际是待编码数字N和参数m的商,余下的部分则是其商的余数,具体计算如下:
q=N/m
r=N%m
对于得到的组号q使用一元编码(Unary code),余下部分r则使用固定长度的二进制编码(binary encoding)。
一元编码(Unarycoding)是一种简单的只能对非负整数进行编码的方法,对于任意非负整数num,它的一元编码就是num个1后面紧跟着一个0。例如:
num | Unary coding |
0 | 0 |
1 | 10 |
2 | 110 |
3 | 1110 |
4 | 11110 |
5 | 111110 |
使用一元编码编码组号也就是商q后,对于余下的部分r则有根据编码数字大小的不同有不同的处理方法。
- 如果参数m是2的次幂(这也是下面将要介绍的Golomb-Rice编码),则使用取r的二进制表示的低log2(m)位,作为r的码字
- 如果参数m不是2的次幂,如果m不是2的次幂,设b=⌈log2(m)⌉
- 如果r<2b−m,则使用b-1位的二进制编码r。
- 如果r≧2b−m,则使用b位二进制对r+2b−m进行编码
FLAC takes advantage of the fact that the error signal generally has a Laplacian (two-sided geometric) distribution, and that there are a set of special Huffman codes called Rice codes that can be used to efficiently encode these kind of signals quickly and without needing a dictionary。