首页 » 技术分享 » FLAC文件格式详解

FLAC文件格式详解

 

参考地址: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文件格式详解,转载请注明来源!

0