参考地址:http://blog.csdn.net/ffgamelife/article/details/7893747
英文原文地址:http://flac.sourceforge.net/format.html
1. FLAC 编码设置只对编码时间有较大影响而对解码影响不大;因为等级越高,编码器就会花越多的时间去寻找最佳的压缩算法,而解码器则根据给定的压缩算法直接解压。
2. FLAC简介
基本结构:
4byte 字符“fLaC”:flac标志,用于识别flac数据流
STREAMINFO文件信息描述块(metadata block):包含必须的信息(采样率、声道数…)
可选的其他描述信息块:(解码时可以不用识别)
一个以上的音频帧(frame)
3. 编码的过程
Flac把未压缩的音频流划分为块(block),并独立压缩,压缩后的数据块形成数据帧(frame),把数据帧连接形成压缩后的flac数据流(stream)
分块(blocking):flac分块大小是可变的。分块大小应适当选择,太小影响压缩率(太多帧头信息),太大难以得到高效的压缩模型。一般44.1k线性采样,分块大小2~6k较合适(默认4096)
声道内解相关性:立体声的左右声道数据之间有许多相关性,可以利用这种相关性压缩数据。Flac有四种方式表示声道数据。
独立模式:左右声道独立编码;
Mid-side模式:转换表达式:mid = (left + right) / 2, side = left - right.。
Left-side:对left声道和side声道编码
Right-side:对right声道和side声道编码
建模(modeling):编码器尝试使用一个数学方法(近似)描述原始信号,这种描述信息一般来说比原始信息小得多,这些数学方法是编码器和解码器都已知的(flac现在有4个种类的预测方法,并可以加入更多方法)flac运行在各个块中使用不同的预测算法。大多时候不能完全精确的描述原始信息,此时还会剩下少量数据残渣(residual, residue, or error)。Flac有两种产生近似值的方法:1)为信号找个合适的多项式。2)简单线性预测(LPC)。前者更快但不精确。
数据残渣编码 :对建模后剩余的数据进行编码,保证数据的无损。目前flac只使用一种编码方法。
帧 (framing):一个音频帧被一个帧头(frameheader)和帧脚(frame footer)包围。帧头以同步字开始,包含了解码这帧的最小信息如采样率,采样位数等,同时包含了这帧里的分块数或采样数及一个8位CRC校验码。帧头可以用来进行再同步。帧尾包含一个16位CRC校验码。如果解码器检测到CRC错误将产生一个silent block。
4. 定义
(block、subblock 指没有被编码的原始数据;frame、subframe指编码后的数据)
Block:一组或多组跨所有声道的采样点(flac采样组数范围16~65535)。
Subblock:一个或多个单声道的采样点,一个Block包含几个声道就有几个subblock,同个block内subblock的采样点数相同。
Blocksize:一个block中任意subblock的采样点个数(与声道数无关)。
Frame:一个frame帧头加一个或多个Subframe
Subframe:一个subframe帧头加某一声道上一个或多个编码后的采样点,一个frame中的所有subframe包含的采样点数一样。
(每次一个subblock被编码成一个subframe,多个subframe组成一个frame)
5. Flac格式(format)
Flac中所有数值都是整形,大端模式,除非特别指出,否则数值都是unsigned的。
一些概述:
Flac比特流以“fLaC”开始,接着是必须的metadata块(STREAMINFO),然后是其他可选的metadata块,接着是音频帧。
Flac做多可以支持到128类metadata,已经定义的包括下面几种:
A。STREAMINFO:包含整个比特流的一些信息,如采样率、声道数、采样总数等。他一定是第一个metadata而且必须有。之后可以接其他metadata,这些metadata可以不用识别直接跳过。
B. APPLICATION:包含第三方应用软件信息,这个段里的32位识别码是flac维护组织提供的,是唯一的。
C. PADDING:没有意义的东西,主要用来后期添加其他metadata。
D. SEEKTABLE:保存快速定位点,一个点由18bytes组成(2k就可以精确到1%的定位),表里可以有任意多个定位点。
E. VORBIS_COMMENT:存储了一系列可读的“名/值”的键值对,使用UTF-8编码。这是flac唯一官方支持的标签段。
F. CUESHEET:存储用在cue sheet中的各种信息。可以用来划分音轨,在备份CD时十分有用。
G. PICTURE:保存相关图片,同时还有url、分辨率等信息,可以有不止一个picture block。
音频数据由一个或多个音频帧组成,每一帧包含一个帧头:同步字,块大小,采样率,声道数…然后是8bitCRC校验码;同时帧头还包含本帧第一个采样点的采样序号(blocksize变长的文件)或本帧的序号(blocksize定长的文件),他们用于精确定位。接着是编码后的subframes,每个subframe代表一个声道。最后是一些有0填充的边界。每个subframe有他自己的帧头用于指出他是怎样被编码的。
当从一个文件中间开始解码时需要知道一个帧的起始点。可以通过一个14bit的同步字来判断。但是他可能会出现在subframe里面,此时可以通过检测剩余数据(没有无效数据)和CRC8.
同样当从中间某帧开始解码时,没有读取STREAMINFO,为了得到采样率和声道数等信息,需要在帧头里加入相关信息,为了减少数据,使用了查表的方法来定义常用的采样率。
表1 FLAC文件结构
Field Name |
Length(bit) |
Description |
文件标记”fLaC” |
32 |
“fLaC”, 文件标记,0x66 0x41 0x61 0x43 |
METADATA BLOCK |
34*8 |
STREAMINFO,必选的metadata block,说明Stream的基本特性。 |
METADATA BLOCK |
|
一个或者多个metadata block,可选。 |
AUDIO FRAMES |
|
一个或者多个Audio Frame |
表2 Metadata block结构
Field Name |
L(bit) |
Description |
|||
METADATA BLOCK HEADER |
|
1 |
‘1’表示是最后一个metadata |
||
BLOCK TYPE |
7 |
0 : STREAMINFO 1 : PADDING 2 : APPLICATION 3 : SEEKTABLE 4 : VORBIS_COMMEN 5 : CUESHEET 6 : PICTURE 7-126 : reserved 127 : 无效 |
|||
BLOCK SIZE |
24 |
数据长度,不包括header,单位byte |
|||
METADATA BLOCK DATA |
STREAMINFO |
16 |
最小的block size,单位sample |
||
16 |
最大的block size,单位sample |
||||
24 |
最小的frame size,单位byte,0表示未知 |
||||
24 |
最大的frame size,单位byte,0表示未知 |
||||
20 |
采样率(Hz) |
||||
3 |
声道数减一,flac支持1~8个声道 |
||||
5 |
采样位数减一,flac支持4~32位采 样位数 |
||||
36 |
一个声道的总采样数,0表示未知 |
||||
128 |
未编码时的原始信号的MD5信息 |
||||
PADDING |
N |
N必须为8的倍数,目前设置为0 |
|||
APPLICATION |
32 |
应用程序ID |
|||
N |
应用程序数据,N必须是8的倍数 |
||||
SEEK TABLE |
多个 SEEK POINT |
64 |
目标帧中第一个sample的序号 |
||
64 |
相对于第一帧开始的偏移(byte) |
||||
16 |
目标帧中的采样数 |
||||
VORBIS COMMENT |
N |
Vorbis comment packet的内容 |
|||
CUESHEET |
HEADER |
128*8 |
媒体目录号,ASCII为0x20-0x7e |
||
64 |
引导sample的个数 |
||||
1 |
1表示CUESHEET对应一个Compact Disc |
||||
7+258*8 |
Reserved |
||||
8 |
Track的个数 |
||||
多个 TRACK |
HEADER |
64 |
Track偏移量,单位sample |
||
8 |
Track号 |
||||
12*8 |
TrackISRC |
||||
1 |
Track类型:0 音乐 1非音乐 |
||||
1 |
pre-emphasis标记 |
||||
6+13*8 |
Reserved |
||||
8 |
索引数目 |
||||
多个 INDEX |
64 |
偏移,单位sample |
|||
8 |
索引号 |
||||
3*8 |
Reserved |
||||
PICTURE |
32 |
图片类型(同ID3v2 APIC) 0 - Other 1- 32x32 pixels 'file icon' (PNG only) 2 - Other file icon 3 - Cover (front) 4 - Cover (back) 5 - Leaflet page 6 - Media (e.g. label side of CD) 7 - Lead artist/lead performer/soloist 8 - Artist/performer 9 - Conductor 10 - Band/Orchestra 11 - Composer 12 - Lyricist/text writer 13 - Recording Location 14 - During recording 15 - During performance 16 - Movie/video screen capture 17 - A bright coloured fish 18 - Illustration 19 - Band/artist logotype 20 - Publisher/Studio logotype |
|||
32 |
MIME类型字符长度(byte) |
||||
N*8 |
MIME类型 |
||||
32 |
描述符长度(byte) |
||||
N*8 |
描述符UTF-8 |
||||
32 |
图片宽度 |
||||
32 |
图片高度 |
||||
32 |
图片颜色深度 |
||||
32 |
索引图使用的颜色数目,0非索引图 |
||||
32 |
图片数据长度 |
||||
N*8 |
图片数据 |
表3 Audio Frame结构
Field Name |
L(bit) |
Description |
||
FRAME HEADER |
14 |
同步字,'11111111111110' |
||
1 |
0 : 强制值,1 : 保留未来使用 |
|||
1 |
分块策略,0:固定块大小,帧头包含帧的序号 1:块大小可变,帧头包含采样点序号 |
|||
4 |
块内的采样数 0000 : reserved 0001 : 192 samples 0010-0101 : 576 * (2^(n-2)) samples 0110 : get 8 bit (blocksize-1) from end of header 0111 : get 16 bit (blocksize-1) from end of header 1000-1111:256 * (2^(n-8)) 采样点 |
|||
4 |
采样率 0000 : get from STREAMINFO metadata block 0001 : 88.2kHz 0010 : 176.4kHz 0011 : 192kHz 0100 : 8kHz 0101 : 16kHz 0110 : 22.05kHz 0111 : 24kHz 1000 : 32kHz 1001 : 44.1kHz 1010 : 48kHz 1011 : 96kHz 1100 : 从header end 获得8位的比特率(kHz) 1101 : 从header end 获得16位的比特率(Hz) 1110 : 从header end 获得16位的比特率(ten Hz) 1111 : invalid, to prevent sync-fooling string of 1s |
|||
4 |
0000-0111 :独立声道减一,分配如下: 1 channel: mono 2 channels: left, right 3 channels: left, right, center 4 channels: left, right, back left, back right 5 channels: left, right, center, back/surround left, back/surround right 6 channels: left, right, center, LFE, back/surround left, back/surround right 7 channels、8 channels: not defined 1000 : left/side stereo: channel 0是left channel, channel 1是side channel 1001 : right/side stereo: channel 0 是 side channel, channel 1是right channel 1010 : mid/side stereo: channel 0 是mid channel, channel 1是side channel 1011-1111 : reserved |
|||
3 |
采样深度 000 : get from STREAMINFO metadata block 001 : 8 bits per sample 010 : 12 bits per sample 011 : reserved 100 : 16 bits per sample 101 : 20 bits per sample 110 : 24 bits per sample 111 : reserved |
|||
1 |
0 : 强制值,1 : 保留未来使用 |
|||
? |
if(variable blocksize) <8-56>:"UTF-8" coded sample number (decoded number is 36 bits) else <8-48>:"UTF-8" coded frame number (decoded number is 31 bits) |
|||
? |
if(blocksize bits == 011x) 8/16 bit (blocksize-1) |
|||
? |
if(sample rate bits == 11xx) 8/16 bit sample rate |
|||
8 |
CRC-8 |
|||
SUBFRAME |
SUBFRAME HEADER |
1 |
填充0,prevent sync-fooling string of 1s |
|
6 |
Subframe类型 000000 : SUBFRAME_CONSTANT 000001 : SUBFRAME_VERBATIM 00001x : reserved 0001xx : reserved 001xxx : if(xxx <= 4) SUBFRAME_FIXED, xxx=order ; else reserved 01xxxx : reserved 1xxxxx : SUBFRAME_LPC, xxxxx=order-1 |
|||
1+k |
'Wasted bits-per-sample' flag 0 : no wasted bits-per-sample in source subblock, k=0 1 : k wasted bits-per-sample in source subblock, k-1 follows, unary coded; e.g. k=3 => 001 follows, k=7 => 0000001 follows. |
|||
SUBFRAME CONSTANT |
N |
N = Bits per Sample |
||
SUBFRAME FIXED |
|
N |
N = Bits per Sample * Predictor Order |
|
RESIDUAL |
|
Encoded Residual |
||
SUBFRAME LPC |
|
N |
N = Bits per Sample * Lpc Order |
|
|
4 |
|
||
|
5 |
|
||
|
N |
|
||
RESIDUAL |
|
Encoded Residual |
||
SUBFRAME VERBATIM |
N*I |
N = Bits per Sample,I = Block Size |
||
? |
|
填充0以实现对齐 |
||
FRAME FOOTER |
16 |
CRC-16 |
转载自原文链接, 如需删除请联系管理员。
原文链接:FLAC文件格式详解,转载请注明来源!