flacFree Lossless Audio Codec是一种无损压缩格式压缩后音质和原 WAV 无损音频完全一致解压后比特流 100% 还原没有音质损失。 flac官网FLAC - What is FLAC?一 、flac整体格式介绍┌─────────────────────────────────────────────────────────────────┐ │ FLAC 文件结构 │ ├─────────────────────────────────────────────────────────────────┤ │ 4 bytes: Stream Sync (fLaC 0x664C6143) │ ├─────────────────────────────────────────────────────────────────┤ │ Metadata Blocks (可变数量) │ │ ├── STREAMINFO (必需第一个) │ │ ├── PADDING 可选 │ │ ├── APPLICATION 可选 │ │ ├── SEEKTABLE 可选 │ │ ├── VORBIS_COMMENT 可选 │ │ ├── CUESHEET 可选 │ │ └── PICTURE 可选 │ ├─────────────────────────────────────────────────────────────────┤ │ Audio Frames (多个) │ │ ├── Frame Header │ │ ├── Subframes (每个通道一个) │ │ └── Frame Footer (CRC-16) │ └─────────────────────────────────────────────────────────────────┘flac音频格式主要由header、metadata和audio frame三个大块组成。1.1header占用4字节固定为字符串 flac 0x66 0x4C 0x61 0x43主要用于快速识别这标准文件FLAC文件。1.2元数据Metadata Block元数据紧靠flac头按顺序排列至少有一个STREAMINFO 块并且STREAMINFO块必须第一个出现。元数据统一格式block block header1 字节 block size3 字节大端 block playload block header endbit1bit Meta type7bitID块名称作用0STREAMINFO核心音频参数必选第一个1PADDING空白填充预留编辑空间2APPLICATION厂商自定义私有数据3SEEKTABLE索引表快速跳转播放4VORBIS_COMMENT标签信息歌手、歌名、专辑、歌词5CUESHEET分轨 CUE 信息整轨无损带分点6PICTURE内嵌专辑封面图片自定义Unkonw扩展1.3 Audio Frame元数据结束后全是连续音频帧每帧独立可解码无需依赖前后帧关键特性帧独立损坏仅单帧失效单帧结构 帧头 Frame Header可变 → 子帧Subframe(每个声道1个) → 帧尾CRC16校验Audio Frame代表一个帧每个帧由帧头子帧和CRC校验组成其中子帧是一个声道一个。二、元数据子块详解2.1 STREAMINFO├─────────────────────────────────────────────────────────────────┤ │ 字节 0-3: 元数据块头部 │ │ ├─ bit 0: is_last (0/1) │ │ ├─ bits 1-7: type 0 (PADDING) │ │ └─ bits 8-31: length (Meta 字节数, 24位) │ ├─────────────────────────────────────────────────────────────────┤ 字节偏移: 0 1 2 3 位偏移: 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 ┌─────────────────────────────────────────────────────────────────────────────────────┐ │ min_blocksize (16 bits) │ │ [0-15] │ ├─────────────────────────────────────────────────────────────────────────────────────┤ │ max_blocksize (16 bits) │ │ [16-31] │ ├─────────────────────────────────────────────────────────────────────────────────────┤ │ min_framesize (24 bits) │ │ [32-55] │ ├─────────────────────────────────────────────────────────────────────────────────────┤ │ max_framesize (24 bits) │ │ [56-79] │ ├─────────────────────────────────────────────────────────────────────────────────────┤ │ sample_rate (20 bits) │ channels (3) │ bits_per_sample (5) │ │ [80-99] │ [100-102] │ [103-107] │ ├─────────────────────────────────────────────────────────────────────────────────────┤ │ total_samples (36 bits) │ │ [108-143] │ ├─────────────────────────────────────────────────────────────────────────────────────┤ │ md5sum (128 bits 16 bytes) │ │ [144-271] │ └─────────────────────────────────────────────────────────────────────────────────────┘字段位长度字节数说明min_blocksize16 bits2最小每帧采样数max_blocksize16 bits2最大每帧采样数min_framesize24 bits3最小帧字节数max_framesize24 bits3最大帧字节数sample_rate20 bits2.5采样率Hzchannels3 bits~0.4通道数bits_per_sample5 bits~0.6位深total_samples36 bits4.5总采样数md5sum128 bits16MD5 校验和总计34 字节34固定大小1, min_blocksize / max_blocksize位范围: 0-15 (min), 16-31 (max)值范围: 16 ~ 65535单位: 采样数/帧块大小指每帧包含的采样数FLAC 支持可变块大小允许编码器根据音频复杂度动态调整典型值4096、4608CD 质量常用2.2 min_framesize / max_framesize位范围: 32-55 (min), 56-79 (max)值范围: 0 ~ 16777215 (24位)单位: 字节/帧帧大小指压缩后的帧字节数0表示未指定编码器可能无法确定精确范围3,sample_rate采样率位范围: 80-99 (20 bits)值范围: 1 ~ 1048575 Hz支持的采样率覆盖范围非常广常见8kHz电话、16kHz语音、44.1kHzCD、48kHz数字音频、96kHz高解析4, channels通道数位范围: 100-102 (3 bits)值范围: 1 ~ 8计算方式: channels (raw_value 1)从单声道到7.1声道 具体可以参考AC3的声道映射表。5bits_per_sample位深位范围: 103-107 (5 bits)值范围: 4 ~ 32 bits计算方式: bits_per_sample (raw_value 1)支持 4-32 位采样精度常见值16-bitCD、24-bit高解析6total_samples总采样数位范围: 108-143 (36 bits)值范围: 0 ~ 2^36 - 1用于计算音频总时长duration total_samples / sample_rate0表示未知长度流式传输时可能无法预先知道7 md5sumMD5 校验和位范围: 144-271 (128 bits 16 bytes) 用途: 验证解码后音频与原始音频的一致性对原始 PCM 数据去除 WAV 头计算 MD5解码完成后可用于校验数据完整性2.2 PADDING┌─────────────────────────────────────────────────────────────────┐ │ PADDING 元数据块结构 │ ├─────────────────────────────────────────────────────────────────┤ │ 字节 0-3: 元数据块头部 │ │ ├─ bit 0: is_last (0/1) │ │ ├─ bits 1-7: type 1 (PADDING) │ │ └─ bits 8-31: length (padding 字节数, 24位) │ ├─────────────────────────────────────────────────────────────────┤ │ 字节 4-(4length-1): padding 数据 │ │ └─ 全部为 0x00 字节或任意值解码器忽略 │ └─────────────────────────────────────────────────────────────────┘2.3 APPLICATION存储应用程序专用数据APPLICATION 块为 FLAC 格式提供了高度灵活的扩展机制允许开发者在不破坏兼容性的前提下添加自定义功能。┌─────────────────────────────────────────────────────────────────┐ │ APPLICATION 元数据块结构 │ ├─────────────────────────────────────────────────────────────────┤ │ 字节 0-3: 元数据块头部 │ │ ├─ bit 0: is_last (0/1) │ │ ├─ bits 1-7: type 2 (APPLICATION) │ │ └─ bits 8-31: length (块数据总长度 4 data_length) │ ├─────────────────────────────────────────────────────────────────┤ │ 字节 4-7: Application ID (4 bytes) │ │ └─ 通常为 ASCII 字符串如 EXIF、CUES 等 │ ├─────────────────────────────────────────────────────────────────┤ │ 字节 8-(8data_length-1): 应用程序数据 │ │ └─ 格式由 Application ID 的所有者定义 │ └─────────────────────────────────────────────────────────────────┘ID说明注册者flacFLAC 官方工具使用Xiph.orgmeta元数据编辑器使用Xiph.orgexifEXIF 图像元数据第三方cprt版权信息第三方CUES音轨索引信息第三方TAGG自定义标签第三方2.4 SeekTable 定位seekTable 是 FLAC 实现高效音频定位的关键组件通过预计算索引点将随机访问的时间复杂度从 O(n) 降低到 O(log n)显著提升了用户体验。┌─────────────────────────────────────────────────────────────────┐ │ SeekTable 元数据块结构 │ ├─────────────────────────────────────────────────────────────────┤ │ 字节 0-3: 元数据块头部 │ │ ├─ bit 0: is_last (0/1) │ │ ├─ bits 1-7: type 3 (SEEKTABLE) │ │ └─ bits 8-31: length (块数据总长度 num_points × 18) │ ├─────────────────────────────────────────────────────────────────┤ │ SeekPoint 数组每个 18 字节 │ │ ├─ SeekPoint[0] │ │ │ ├─ sample_number (8 bytes) │ │ │ ├─ stream_offset (8 bytes) │ │ │ └─ frame_samples (2 bytes) │ │ ├─ SeekPoint[1] │ │ │ └─ ... │ │ └─ SeekPoint[num_points-1] │ │ └─ ... │ └─────────────────────────────────────────────────────────────────┘字段位长度字节数说明sample_number64 bits8目标帧的起始采样编号stream_offset64 bits8目标帧相对于第一帧起始位置的字节偏移frame_samples16 bits2目标帧包含的采样数单个 SeekPoint18 字节18固定大小2.5 VorbisComment存储文本标签艺术家、标题、专辑等灵活、易读、扩展性强┌─────────────────────────────────────────────────────────────────┐ │ VorbisComment 块结构 │ ├─────────────────────────────────────────────────────────────────┤ │ 字节 0-3: 元数据块头部 │ │ ├─ bit 0: is_last (0/1) │ │ ├─ bits 1-7: type 4 (VORBIS_COMMENT) │ │ └─ bits 8-31: length │ ├─────────────────────────────────────────────────────────────────┤ │ Vendor String: │ │ ├─ 4 bytes: vendor_length (32-bit LE) │ │ └─ vendor_length bytes: vendor string (UTF-8) │ ├─────────────────────────────────────────────────────────────────┤ │ Comments: │ │ ├─ 4 bytes: num_comments (32-bit LE) │ │ └─ num_comments × Comment Entry: │ │ ├─ 4 bytes: entry_length (32-bit LE) │ │ └─ entry_length bytes: NAMEVALUE (UTF-8) │ └─────────────────────────────────────────────────────────────────┘字段大小说明vendor_string可变编码器/工具标识字符串num_comments4 字节注释条目数量comments[]可变注释条目数组2.6 CueSheet定义音轨边界和索引点精确到采样级支持 CD-DA 标准┌─────────────────────────────────────────────────────────────────┐ │ CueSheet 块结构 │ ├─────────────────────────────────────────────────────────────────┤ │ 字节 0-3: 元数据块头部 │ │ ├─ bit 0: is_last (0/1) │ │ ├─ bits 1-7: type 5 (CUESHEET) │ │ └─ bits 8-31: length │ ├─────────────────────────────────────────────────────────────────┤ │ 128 bytes: media_catalog_number (ASCII, 右填充 NUL) │ ├─────────────────────────────────────────────────────────────────┤ │ 8 bytes: lead_in (64-bit BE) │ ├─────────────────────────────────────────────────────────────────┤ │ 1 byte: is_cd (0/1) │ ├─────────────────────────────────────────────────────────────────┤ │ 258 bytes: reserved (必须为 0) │ ├─────────────────────────────────────────────────────────────────┤ │ 1 byte: num_tracks (1-100) │ ├─────────────────────────────────────────────────────────────────┤ │ num_tracks × Track Structure: │ │ ├─ 8 bytes: track_offset (64-bit BE) │ │ ├─ 1 byte: track_number (1-99, 170lead-out) │ │ ├─ 12 bytes: isrc (ASCII) │ │ ├─ 1 byte: track_type (bit 0) pre_emphasis (bit 1) │ │ ├─ 13 bytes: reserved │ │ ├─ 1 byte: num_indices │ │ └─ num_indices × Index Structure: │ │ ├─ 8 bytes: index_offset (64-bit BE) │ │ ├─ 1 byte: index_number (0-99) │ │ └─ 3 bytes: reserved │ └─────────────────────────────────────────────────────────────────┘字段大小说明media_catalog_number128 字节媒体目录号MCNlead_in8 字节CD 导入区采样数通常为 2秒 × 采样率is_cd1 字节是否为 CD-DA 格式num_tracks1 字节音轨数量1-100tracks[]可变音轨信息数组2.7 Picture存储封面图片和其他图像支持多种图片格式可存储多个图片MIME type image/jpeg → JPEG 格式MIME type image/png → PNG 格式MIME type -- → 图片 URLdata 字段为 URL 字符串┌─────────────────────────────────────────────────────────────────┐ │ Picture 块结构 │ ├─────────────────────────────────────────────────────────────────┤ │ 字节 0-3: 元数据块头部 │ │ ├─ bit 0: is_last (0/1) │ │ ├─ bits 1-7: type 6 (PICTURE) │ │ └─ bits 8-31: length │ ├─────────────────────────────────────────────────────────────────┤ │ 4 bytes: picture_type (32-bit BE) │ ├─────────────────────────────────────────────────────────────────┤ │ MIME Type: │ │ ├─ 4 bytes: mime_type_length (32-bit BE) │ │ └─ mime_type_length bytes: MIME type string │ ├─────────────────────────────────────────────────────────────────┤ │ Description: │ │ ├─ 4 bytes: description_length (32-bit BE) │ │ └─ description_length bytes: description (UTF-8) │ ├─────────────────────────────────────────────────────────────────┤ │ 4 bytes: width (32-bit BE) │ ├─────────────────────────────────────────────────────────────────┤ │ 4 bytes: height (32-bit BE) │ ├─────────────────────────────────────────────────────────────────┤ │ 4 bytes: depth (32-bit BE) │ ├─────────────────────────────────────────────────────────────────┤ │ 4 bytes: colors (32-bit BE) │ ├─────────────────────────────────────────────────────────────────┤ │ Picture Data: │ │ ├─ 4 bytes: data_length (32-bit BE) │ │ └─ data_length bytes: 图片二进制数据 │ └─────────────────────────────────────────────────────────────────┘字段大小说明type4 字节图片类型见上表mime_type可变MIME 类型如image/jpeg、image/pngdescription可变图片描述UTF-8width4 字节宽度像素height4 字节高度像素depth4 字节位深度如 24 表示 RGB 各 8 位colors4 字节颜色数索引色使用0 表示真彩色data_length4 字节图片数据长度data可变图片二进制数据2.7 Unknow用户可以根据自己的需要自定义类型ID 和用途扩展音频的扩展信息。三、Audio Fame3.1 Frame 概览┌─────────────────────────────────────────────────────────────────┐ │ FLAC Audio Frame │ ├─────────────────────────────────────────────────────────────────┤ │ Frame Header (可变长度14-52 bits) │ │ ├─ Sync Code (14 bits: 0b11111111111110) │ │ ├─ Reserved (1 bit: 0) │ │ ├─ Blocking Strategy (1 bit) │ │ ├─ Block Size (4 bits) │ │ ├─ Sample Rate (4 bits) │ │ ├─ Channel Assignment (4 bits) │ │ ├─ Bits per Sample (3 bits) │ │ ├─ Reserved (1 bit: 0) │ │ └─ Frame Number / Sample Number (可变) │ │ └─ CRC-8 (8 bits) │ ├─────────────────────────────────────────────────────────────────┤ │ Subframes (每个通道一个可变长度) │ │ ├─ Subframe 0 (通道 0) │ │ ├─ Subframe 1 (通道 1) │ │ ├─ ... │ │ └─ Subframe N-1 (通道 N-1) │ ├─────────────────────────────────────────────────────────────────┤ │ Frame Footer │ │ └─ CRC-16 (16 bits) │ └─────────────────────────────────────────────────────────────────┘3.2 Frame Header位偏移: 0 14 15 16 20 ┌────────────────┬────────┬────────┬────────┬────────┬────────┐ │ Sync Code │Reserved│ Block │ Sample │Channel │ Bits │ │ (14 bits) │ (1 bit)│ Size │ Rate │Assign │ per │ │ 0b11111111111110│ │(4 bits)│(4 bits)│(4 bits)│Sample │ │ │ │ │ │ │(3 bits)│ └────────────────┴────────┴────────┴────────┴────────┴────────┘ 位偏移: 23 24 36 ┌────────┬──────────────────────────────────────────────────┐ │Reserved│ Frame/Sample Number (8-36 bits) │ │ (1 bit)│ │ └────────┴──────────────────────────────────────────────────┘ 位偏移: 36/40 ┌────────┐ │ CRC-8 │ │(8 bits)│ └────────┘3.2.1 sync Code解码器通过寻找这个特定的位模式来定位帧的起始位置。位长度: 14 bits 固定值: 0b11111111111110 (0x3FFE) 用途: 帧同步标识3.2.2 Block Size (4 bits)编码值块大小采样数说明00001600013200106400111280100256010151201101024011120481000-1010特殊编码见下表1011-1111直接编码值111-16 对应 12-17特殊编码1000-1010编码值块大小来源1000STREAMINFO.min_blocksize1001STREAMINFO.max_blocksize1010接下来 8 位直接编码3.2.3 Sample Rate (4 bits)编码值采样率Hz说明00008000000116000001022050001124000010032000010144100CD 标准011048000专业音频011196000高解析1000-1011特殊编码见下表1100-1111接下来 8/16 位直接编码特殊编码1000-1011编码值采样率来源/计算1000STREAMINFO.sample_rate1001接下来 8 位乘以 10001010接下来 16 位直接编码1011接下来 16 位乘以 103.2.4 Channel Assignment (4 bits)编码值通道数通道布局0000-01111-8独立通道各通道独立编码10002左边声道LeftSide10012右边声道RightSide10102中边声道MidSide1011-1111保留立体声编码模式LeftSide: Left Left_original Right Left_original - Side RightSide: Right Right_original Left Right_original - Side MidSide: Mid (Left Right) / 2 Side (Left - Right) / 23.2.5 Bits per Sample (3 bits)编码值位深bits000800112010160112010024101特殊编码见下表110特殊编码见下表111保留特殊编码编码值位深来源101STREAMINFO.bits_per_sample110接下来 5 位值14-32 bits3.2.6 Frame Number / Sample Number长度: 可变取决于编码方式 类型选择: - frame_number: 帧编号较小值适合短文件 - sample_number: 采样编号较大值适合长文件编号编码规则条件编码方式长度sample_number 2^8直接编码8 bitssample_number 2^160 16 bits17 bitssample_number 2^240 24 bits25 bitssample_number 2^360 36 bits37 bits使用帧编号1 frame_number1 8/16/24/32 bits3.2.7 CRC-8 校验多项式: x^8 x^2 x^1 x^0 初始值: 0 覆盖范围: 整个帧头从 sync code 到编号字段3.3 SubFrame 详细解析3.3.1 通用结构所有的子帧都符合以下格式┌─────────────────────────────────────────────────────────────┐ │ SubFrame 结构 │ ├─────────────────────────────────────────────────────────────┤ │ SubFrame Header (10-12 bits) │ │ ├─ Zero Padding (1 bit: 0) │ │ ├─ Type (6 bits) │ │ └─ Wasted Bits Flag (1 bit) Wasted Bits (0-4 bits) │ ├─────────────────────────────────────────────────────────────┤ │ SubFrame Data (可变长度) │ │ └─ 取决于具体类型 │ └─────────────────────────────────────────────────────────────┘Type 字段的位编码位模式类型附加信息000000CONSTANT无000001VERBATIM无00001xFIXEDorder 0-10001xxFIXEDorder 2-3001xxxFIXEDorder 4-7实际最大为 4010xxx保留-100xxxLPCorder 0-7101xxxLPCorder 8-15110xxxLPCorder 16-23111xxxLPCorder 24-313.3.2 CONSTANT SubFrame┌─────────────────────────────────────────────────────┐ │ CONSTANT SubFrame 完整位布局 │ ├─────────────────────────────────────────────────────┤ │ Header (8 bits): │ │ bit 0: zero_padding 0 │ │ bits 1-6: type 0x00 (CONSTANT) │ │ bit 7: wasted_bits_flag 0 │ ├─────────────────────────────────────────────────────┤ │ Data: │ │ value (bits_per_sample bits) │ └─────────────────────────────────────────────────────┘静音段音频中的静音部分所有采样值为 0DC 偏移所有采样值相同的信号测试信号固定频率的方波等3.3.3 VERBATIM SubFrame┌─────────────────────────────────────────────────────┐ │ VERBATIM SubFrame 完整位布局 │ ├─────────────────────────────────────────────────────┤ │ Header (8 bits): │ │ bit 0: zero_padding 0 │ │ bits 1-6: type 0x01 (VERBATIM) │ │ bit 7: wasted_bits_flag 0 │ ├─────────────────────────────────────────────────────┤ │ Data: │ │ raw_samples (blocksize × bits_per_sample bits) │ └─────────────────────────────────────────────────────┘随机噪声无法预测的信号如白噪声复杂瞬态鼓声、打击乐等突发信号已压缩数据已加密或已压缩的音频片段特性说明压缩率无压缩1:1解码速度最快直接复制存储格式原始 PCM 数据3.3.4 FIXED SubFrame┌─────────────────────────────────────────────────────┐ │ FIXED SubFrame 完整位布局 │ ├─────────────────────────────────────────────────────┤ │ Header (8-13 bits): │ │ bit 0: zero_padding 0 │ │ bits 1-6: type 0x02-0x1F (FIXED order) │ │ bit 7: wasted_bits_flag │ │ bits 8-12: wasted_bits (if flag1) │ ├─────────────────────────────────────────────────────┤ │ Warmup Samples: │ │ order × bits_per_sample bits │ ├─────────────────────────────────────────────────────┤ │ Residual Data (Rice 编码): │ │ (blocksize - order) 个残差值 │ └─────────────────────────────────────────────────────┘音乐信号大多数音乐具有良好的相关性语音信号人声具有较强的预测性周期性信号乐器演奏的持续音FIXED 使用固定系数的线性预测系数由阶数决定Order预测公式系数0predictor 0无1predictor sample[n-1][1]2predictor 2×sample[n-1] - sample[n-2][2, -1]3predictor 3×sample[n-1] - 3×sample[n-2] sample[n-3][3, -3, 1]4predictor 4×sample[n-1] - 6×sample[n-2] 4×sample[n-3] - sample[n-4][4, -6, 4, -1]3.3.5LPC SubFrame线性预测编码┌─────────────────────────────────────────────────────┐ │ LPC SubFrame 完整位布局 │ ├─────────────────────────────────────────────────────┤ │ Header (17-22 bits): │ │ bit 0: zero_padding 0 │ │ bits 1-6: type 0x40-0x7F (LPC order) │ │ bit 7: wasted_bits_flag │ │ bits 8-12: wasted_bits (if flag1) │ │ bits 13-16: qlp_coeff_precision (4 bits) │ │ bits 17-21: quantization_level (5 bits) │ ├─────────────────────────────────────────────────────┤ │ LPC Coefficients: │ │ order × qlp_coeff_precision bits │ ├─────────────────────────────────────────────────────┤ │ Warmup Samples: │ │ order × bits_per_sample bits │ ├─────────────────────────────────────────────────────┤ │ Residual Data (Rice 编码): │ │ (blocksize - order) 个残差值 │ └─────────────────────────────────────────────────────┘LPC 使用自适应系数的线性预测预测公式: predictor[n] Σ(qlp_coeff[i] × sample[n-i-1]) / 2^quantization_level 残差计算: residual[n] actual[n] - predictor[n] 编码器使用自相关法计算 LPC 系数步骤: 1. 计算自相关函数 R[k] Σ(sample[i] × sample[ik]) 2. 解 Yule-Walker 方程得到 LPC 系数 3. 量化系数并确定精度
音频格式之flac
发布时间:2026/6/26 5:56:37
flacFree Lossless Audio Codec是一种无损压缩格式压缩后音质和原 WAV 无损音频完全一致解压后比特流 100% 还原没有音质损失。 flac官网FLAC - What is FLAC?一 、flac整体格式介绍┌─────────────────────────────────────────────────────────────────┐ │ FLAC 文件结构 │ ├─────────────────────────────────────────────────────────────────┤ │ 4 bytes: Stream Sync (fLaC 0x664C6143) │ ├─────────────────────────────────────────────────────────────────┤ │ Metadata Blocks (可变数量) │ │ ├── STREAMINFO (必需第一个) │ │ ├── PADDING 可选 │ │ ├── APPLICATION 可选 │ │ ├── SEEKTABLE 可选 │ │ ├── VORBIS_COMMENT 可选 │ │ ├── CUESHEET 可选 │ │ └── PICTURE 可选 │ ├─────────────────────────────────────────────────────────────────┤ │ Audio Frames (多个) │ │ ├── Frame Header │ │ ├── Subframes (每个通道一个) │ │ └── Frame Footer (CRC-16) │ └─────────────────────────────────────────────────────────────────┘flac音频格式主要由header、metadata和audio frame三个大块组成。1.1header占用4字节固定为字符串 flac 0x66 0x4C 0x61 0x43主要用于快速识别这标准文件FLAC文件。1.2元数据Metadata Block元数据紧靠flac头按顺序排列至少有一个STREAMINFO 块并且STREAMINFO块必须第一个出现。元数据统一格式block block header1 字节 block size3 字节大端 block playload block header endbit1bit Meta type7bitID块名称作用0STREAMINFO核心音频参数必选第一个1PADDING空白填充预留编辑空间2APPLICATION厂商自定义私有数据3SEEKTABLE索引表快速跳转播放4VORBIS_COMMENT标签信息歌手、歌名、专辑、歌词5CUESHEET分轨 CUE 信息整轨无损带分点6PICTURE内嵌专辑封面图片自定义Unkonw扩展1.3 Audio Frame元数据结束后全是连续音频帧每帧独立可解码无需依赖前后帧关键特性帧独立损坏仅单帧失效单帧结构 帧头 Frame Header可变 → 子帧Subframe(每个声道1个) → 帧尾CRC16校验Audio Frame代表一个帧每个帧由帧头子帧和CRC校验组成其中子帧是一个声道一个。二、元数据子块详解2.1 STREAMINFO├─────────────────────────────────────────────────────────────────┤ │ 字节 0-3: 元数据块头部 │ │ ├─ bit 0: is_last (0/1) │ │ ├─ bits 1-7: type 0 (PADDING) │ │ └─ bits 8-31: length (Meta 字节数, 24位) │ ├─────────────────────────────────────────────────────────────────┤ 字节偏移: 0 1 2 3 位偏移: 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 ┌─────────────────────────────────────────────────────────────────────────────────────┐ │ min_blocksize (16 bits) │ │ [0-15] │ ├─────────────────────────────────────────────────────────────────────────────────────┤ │ max_blocksize (16 bits) │ │ [16-31] │ ├─────────────────────────────────────────────────────────────────────────────────────┤ │ min_framesize (24 bits) │ │ [32-55] │ ├─────────────────────────────────────────────────────────────────────────────────────┤ │ max_framesize (24 bits) │ │ [56-79] │ ├─────────────────────────────────────────────────────────────────────────────────────┤ │ sample_rate (20 bits) │ channels (3) │ bits_per_sample (5) │ │ [80-99] │ [100-102] │ [103-107] │ ├─────────────────────────────────────────────────────────────────────────────────────┤ │ total_samples (36 bits) │ │ [108-143] │ ├─────────────────────────────────────────────────────────────────────────────────────┤ │ md5sum (128 bits 16 bytes) │ │ [144-271] │ └─────────────────────────────────────────────────────────────────────────────────────┘字段位长度字节数说明min_blocksize16 bits2最小每帧采样数max_blocksize16 bits2最大每帧采样数min_framesize24 bits3最小帧字节数max_framesize24 bits3最大帧字节数sample_rate20 bits2.5采样率Hzchannels3 bits~0.4通道数bits_per_sample5 bits~0.6位深total_samples36 bits4.5总采样数md5sum128 bits16MD5 校验和总计34 字节34固定大小1, min_blocksize / max_blocksize位范围: 0-15 (min), 16-31 (max)值范围: 16 ~ 65535单位: 采样数/帧块大小指每帧包含的采样数FLAC 支持可变块大小允许编码器根据音频复杂度动态调整典型值4096、4608CD 质量常用2.2 min_framesize / max_framesize位范围: 32-55 (min), 56-79 (max)值范围: 0 ~ 16777215 (24位)单位: 字节/帧帧大小指压缩后的帧字节数0表示未指定编码器可能无法确定精确范围3,sample_rate采样率位范围: 80-99 (20 bits)值范围: 1 ~ 1048575 Hz支持的采样率覆盖范围非常广常见8kHz电话、16kHz语音、44.1kHzCD、48kHz数字音频、96kHz高解析4, channels通道数位范围: 100-102 (3 bits)值范围: 1 ~ 8计算方式: channels (raw_value 1)从单声道到7.1声道 具体可以参考AC3的声道映射表。5bits_per_sample位深位范围: 103-107 (5 bits)值范围: 4 ~ 32 bits计算方式: bits_per_sample (raw_value 1)支持 4-32 位采样精度常见值16-bitCD、24-bit高解析6total_samples总采样数位范围: 108-143 (36 bits)值范围: 0 ~ 2^36 - 1用于计算音频总时长duration total_samples / sample_rate0表示未知长度流式传输时可能无法预先知道7 md5sumMD5 校验和位范围: 144-271 (128 bits 16 bytes) 用途: 验证解码后音频与原始音频的一致性对原始 PCM 数据去除 WAV 头计算 MD5解码完成后可用于校验数据完整性2.2 PADDING┌─────────────────────────────────────────────────────────────────┐ │ PADDING 元数据块结构 │ ├─────────────────────────────────────────────────────────────────┤ │ 字节 0-3: 元数据块头部 │ │ ├─ bit 0: is_last (0/1) │ │ ├─ bits 1-7: type 1 (PADDING) │ │ └─ bits 8-31: length (padding 字节数, 24位) │ ├─────────────────────────────────────────────────────────────────┤ │ 字节 4-(4length-1): padding 数据 │ │ └─ 全部为 0x00 字节或任意值解码器忽略 │ └─────────────────────────────────────────────────────────────────┘2.3 APPLICATION存储应用程序专用数据APPLICATION 块为 FLAC 格式提供了高度灵活的扩展机制允许开发者在不破坏兼容性的前提下添加自定义功能。┌─────────────────────────────────────────────────────────────────┐ │ APPLICATION 元数据块结构 │ ├─────────────────────────────────────────────────────────────────┤ │ 字节 0-3: 元数据块头部 │ │ ├─ bit 0: is_last (0/1) │ │ ├─ bits 1-7: type 2 (APPLICATION) │ │ └─ bits 8-31: length (块数据总长度 4 data_length) │ ├─────────────────────────────────────────────────────────────────┤ │ 字节 4-7: Application ID (4 bytes) │ │ └─ 通常为 ASCII 字符串如 EXIF、CUES 等 │ ├─────────────────────────────────────────────────────────────────┤ │ 字节 8-(8data_length-1): 应用程序数据 │ │ └─ 格式由 Application ID 的所有者定义 │ └─────────────────────────────────────────────────────────────────┘ID说明注册者flacFLAC 官方工具使用Xiph.orgmeta元数据编辑器使用Xiph.orgexifEXIF 图像元数据第三方cprt版权信息第三方CUES音轨索引信息第三方TAGG自定义标签第三方2.4 SeekTable 定位seekTable 是 FLAC 实现高效音频定位的关键组件通过预计算索引点将随机访问的时间复杂度从 O(n) 降低到 O(log n)显著提升了用户体验。┌─────────────────────────────────────────────────────────────────┐ │ SeekTable 元数据块结构 │ ├─────────────────────────────────────────────────────────────────┤ │ 字节 0-3: 元数据块头部 │ │ ├─ bit 0: is_last (0/1) │ │ ├─ bits 1-7: type 3 (SEEKTABLE) │ │ └─ bits 8-31: length (块数据总长度 num_points × 18) │ ├─────────────────────────────────────────────────────────────────┤ │ SeekPoint 数组每个 18 字节 │ │ ├─ SeekPoint[0] │ │ │ ├─ sample_number (8 bytes) │ │ │ ├─ stream_offset (8 bytes) │ │ │ └─ frame_samples (2 bytes) │ │ ├─ SeekPoint[1] │ │ │ └─ ... │ │ └─ SeekPoint[num_points-1] │ │ └─ ... │ └─────────────────────────────────────────────────────────────────┘字段位长度字节数说明sample_number64 bits8目标帧的起始采样编号stream_offset64 bits8目标帧相对于第一帧起始位置的字节偏移frame_samples16 bits2目标帧包含的采样数单个 SeekPoint18 字节18固定大小2.5 VorbisComment存储文本标签艺术家、标题、专辑等灵活、易读、扩展性强┌─────────────────────────────────────────────────────────────────┐ │ VorbisComment 块结构 │ ├─────────────────────────────────────────────────────────────────┤ │ 字节 0-3: 元数据块头部 │ │ ├─ bit 0: is_last (0/1) │ │ ├─ bits 1-7: type 4 (VORBIS_COMMENT) │ │ └─ bits 8-31: length │ ├─────────────────────────────────────────────────────────────────┤ │ Vendor String: │ │ ├─ 4 bytes: vendor_length (32-bit LE) │ │ └─ vendor_length bytes: vendor string (UTF-8) │ ├─────────────────────────────────────────────────────────────────┤ │ Comments: │ │ ├─ 4 bytes: num_comments (32-bit LE) │ │ └─ num_comments × Comment Entry: │ │ ├─ 4 bytes: entry_length (32-bit LE) │ │ └─ entry_length bytes: NAMEVALUE (UTF-8) │ └─────────────────────────────────────────────────────────────────┘字段大小说明vendor_string可变编码器/工具标识字符串num_comments4 字节注释条目数量comments[]可变注释条目数组2.6 CueSheet定义音轨边界和索引点精确到采样级支持 CD-DA 标准┌─────────────────────────────────────────────────────────────────┐ │ CueSheet 块结构 │ ├─────────────────────────────────────────────────────────────────┤ │ 字节 0-3: 元数据块头部 │ │ ├─ bit 0: is_last (0/1) │ │ ├─ bits 1-7: type 5 (CUESHEET) │ │ └─ bits 8-31: length │ ├─────────────────────────────────────────────────────────────────┤ │ 128 bytes: media_catalog_number (ASCII, 右填充 NUL) │ ├─────────────────────────────────────────────────────────────────┤ │ 8 bytes: lead_in (64-bit BE) │ ├─────────────────────────────────────────────────────────────────┤ │ 1 byte: is_cd (0/1) │ ├─────────────────────────────────────────────────────────────────┤ │ 258 bytes: reserved (必须为 0) │ ├─────────────────────────────────────────────────────────────────┤ │ 1 byte: num_tracks (1-100) │ ├─────────────────────────────────────────────────────────────────┤ │ num_tracks × Track Structure: │ │ ├─ 8 bytes: track_offset (64-bit BE) │ │ ├─ 1 byte: track_number (1-99, 170lead-out) │ │ ├─ 12 bytes: isrc (ASCII) │ │ ├─ 1 byte: track_type (bit 0) pre_emphasis (bit 1) │ │ ├─ 13 bytes: reserved │ │ ├─ 1 byte: num_indices │ │ └─ num_indices × Index Structure: │ │ ├─ 8 bytes: index_offset (64-bit BE) │ │ ├─ 1 byte: index_number (0-99) │ │ └─ 3 bytes: reserved │ └─────────────────────────────────────────────────────────────────┘字段大小说明media_catalog_number128 字节媒体目录号MCNlead_in8 字节CD 导入区采样数通常为 2秒 × 采样率is_cd1 字节是否为 CD-DA 格式num_tracks1 字节音轨数量1-100tracks[]可变音轨信息数组2.7 Picture存储封面图片和其他图像支持多种图片格式可存储多个图片MIME type image/jpeg → JPEG 格式MIME type image/png → PNG 格式MIME type -- → 图片 URLdata 字段为 URL 字符串┌─────────────────────────────────────────────────────────────────┐ │ Picture 块结构 │ ├─────────────────────────────────────────────────────────────────┤ │ 字节 0-3: 元数据块头部 │ │ ├─ bit 0: is_last (0/1) │ │ ├─ bits 1-7: type 6 (PICTURE) │ │ └─ bits 8-31: length │ ├─────────────────────────────────────────────────────────────────┤ │ 4 bytes: picture_type (32-bit BE) │ ├─────────────────────────────────────────────────────────────────┤ │ MIME Type: │ │ ├─ 4 bytes: mime_type_length (32-bit BE) │ │ └─ mime_type_length bytes: MIME type string │ ├─────────────────────────────────────────────────────────────────┤ │ Description: │ │ ├─ 4 bytes: description_length (32-bit BE) │ │ └─ description_length bytes: description (UTF-8) │ ├─────────────────────────────────────────────────────────────────┤ │ 4 bytes: width (32-bit BE) │ ├─────────────────────────────────────────────────────────────────┤ │ 4 bytes: height (32-bit BE) │ ├─────────────────────────────────────────────────────────────────┤ │ 4 bytes: depth (32-bit BE) │ ├─────────────────────────────────────────────────────────────────┤ │ 4 bytes: colors (32-bit BE) │ ├─────────────────────────────────────────────────────────────────┤ │ Picture Data: │ │ ├─ 4 bytes: data_length (32-bit BE) │ │ └─ data_length bytes: 图片二进制数据 │ └─────────────────────────────────────────────────────────────────┘字段大小说明type4 字节图片类型见上表mime_type可变MIME 类型如image/jpeg、image/pngdescription可变图片描述UTF-8width4 字节宽度像素height4 字节高度像素depth4 字节位深度如 24 表示 RGB 各 8 位colors4 字节颜色数索引色使用0 表示真彩色data_length4 字节图片数据长度data可变图片二进制数据2.7 Unknow用户可以根据自己的需要自定义类型ID 和用途扩展音频的扩展信息。三、Audio Fame3.1 Frame 概览┌─────────────────────────────────────────────────────────────────┐ │ FLAC Audio Frame │ ├─────────────────────────────────────────────────────────────────┤ │ Frame Header (可变长度14-52 bits) │ │ ├─ Sync Code (14 bits: 0b11111111111110) │ │ ├─ Reserved (1 bit: 0) │ │ ├─ Blocking Strategy (1 bit) │ │ ├─ Block Size (4 bits) │ │ ├─ Sample Rate (4 bits) │ │ ├─ Channel Assignment (4 bits) │ │ ├─ Bits per Sample (3 bits) │ │ ├─ Reserved (1 bit: 0) │ │ └─ Frame Number / Sample Number (可变) │ │ └─ CRC-8 (8 bits) │ ├─────────────────────────────────────────────────────────────────┤ │ Subframes (每个通道一个可变长度) │ │ ├─ Subframe 0 (通道 0) │ │ ├─ Subframe 1 (通道 1) │ │ ├─ ... │ │ └─ Subframe N-1 (通道 N-1) │ ├─────────────────────────────────────────────────────────────────┤ │ Frame Footer │ │ └─ CRC-16 (16 bits) │ └─────────────────────────────────────────────────────────────────┘3.2 Frame Header位偏移: 0 14 15 16 20 ┌────────────────┬────────┬────────┬────────┬────────┬────────┐ │ Sync Code │Reserved│ Block │ Sample │Channel │ Bits │ │ (14 bits) │ (1 bit)│ Size │ Rate │Assign │ per │ │ 0b11111111111110│ │(4 bits)│(4 bits)│(4 bits)│Sample │ │ │ │ │ │ │(3 bits)│ └────────────────┴────────┴────────┴────────┴────────┴────────┘ 位偏移: 23 24 36 ┌────────┬──────────────────────────────────────────────────┐ │Reserved│ Frame/Sample Number (8-36 bits) │ │ (1 bit)│ │ └────────┴──────────────────────────────────────────────────┘ 位偏移: 36/40 ┌────────┐ │ CRC-8 │ │(8 bits)│ └────────┘3.2.1 sync Code解码器通过寻找这个特定的位模式来定位帧的起始位置。位长度: 14 bits 固定值: 0b11111111111110 (0x3FFE) 用途: 帧同步标识3.2.2 Block Size (4 bits)编码值块大小采样数说明00001600013200106400111280100256010151201101024011120481000-1010特殊编码见下表1011-1111直接编码值111-16 对应 12-17特殊编码1000-1010编码值块大小来源1000STREAMINFO.min_blocksize1001STREAMINFO.max_blocksize1010接下来 8 位直接编码3.2.3 Sample Rate (4 bits)编码值采样率Hz说明00008000000116000001022050001124000010032000010144100CD 标准011048000专业音频011196000高解析1000-1011特殊编码见下表1100-1111接下来 8/16 位直接编码特殊编码1000-1011编码值采样率来源/计算1000STREAMINFO.sample_rate1001接下来 8 位乘以 10001010接下来 16 位直接编码1011接下来 16 位乘以 103.2.4 Channel Assignment (4 bits)编码值通道数通道布局0000-01111-8独立通道各通道独立编码10002左边声道LeftSide10012右边声道RightSide10102中边声道MidSide1011-1111保留立体声编码模式LeftSide: Left Left_original Right Left_original - Side RightSide: Right Right_original Left Right_original - Side MidSide: Mid (Left Right) / 2 Side (Left - Right) / 23.2.5 Bits per Sample (3 bits)编码值位深bits000800112010160112010024101特殊编码见下表110特殊编码见下表111保留特殊编码编码值位深来源101STREAMINFO.bits_per_sample110接下来 5 位值14-32 bits3.2.6 Frame Number / Sample Number长度: 可变取决于编码方式 类型选择: - frame_number: 帧编号较小值适合短文件 - sample_number: 采样编号较大值适合长文件编号编码规则条件编码方式长度sample_number 2^8直接编码8 bitssample_number 2^160 16 bits17 bitssample_number 2^240 24 bits25 bitssample_number 2^360 36 bits37 bits使用帧编号1 frame_number1 8/16/24/32 bits3.2.7 CRC-8 校验多项式: x^8 x^2 x^1 x^0 初始值: 0 覆盖范围: 整个帧头从 sync code 到编号字段3.3 SubFrame 详细解析3.3.1 通用结构所有的子帧都符合以下格式┌─────────────────────────────────────────────────────────────┐ │ SubFrame 结构 │ ├─────────────────────────────────────────────────────────────┤ │ SubFrame Header (10-12 bits) │ │ ├─ Zero Padding (1 bit: 0) │ │ ├─ Type (6 bits) │ │ └─ Wasted Bits Flag (1 bit) Wasted Bits (0-4 bits) │ ├─────────────────────────────────────────────────────────────┤ │ SubFrame Data (可变长度) │ │ └─ 取决于具体类型 │ └─────────────────────────────────────────────────────────────┘Type 字段的位编码位模式类型附加信息000000CONSTANT无000001VERBATIM无00001xFIXEDorder 0-10001xxFIXEDorder 2-3001xxxFIXEDorder 4-7实际最大为 4010xxx保留-100xxxLPCorder 0-7101xxxLPCorder 8-15110xxxLPCorder 16-23111xxxLPCorder 24-313.3.2 CONSTANT SubFrame┌─────────────────────────────────────────────────────┐ │ CONSTANT SubFrame 完整位布局 │ ├─────────────────────────────────────────────────────┤ │ Header (8 bits): │ │ bit 0: zero_padding 0 │ │ bits 1-6: type 0x00 (CONSTANT) │ │ bit 7: wasted_bits_flag 0 │ ├─────────────────────────────────────────────────────┤ │ Data: │ │ value (bits_per_sample bits) │ └─────────────────────────────────────────────────────┘静音段音频中的静音部分所有采样值为 0DC 偏移所有采样值相同的信号测试信号固定频率的方波等3.3.3 VERBATIM SubFrame┌─────────────────────────────────────────────────────┐ │ VERBATIM SubFrame 完整位布局 │ ├─────────────────────────────────────────────────────┤ │ Header (8 bits): │ │ bit 0: zero_padding 0 │ │ bits 1-6: type 0x01 (VERBATIM) │ │ bit 7: wasted_bits_flag 0 │ ├─────────────────────────────────────────────────────┤ │ Data: │ │ raw_samples (blocksize × bits_per_sample bits) │ └─────────────────────────────────────────────────────┘随机噪声无法预测的信号如白噪声复杂瞬态鼓声、打击乐等突发信号已压缩数据已加密或已压缩的音频片段特性说明压缩率无压缩1:1解码速度最快直接复制存储格式原始 PCM 数据3.3.4 FIXED SubFrame┌─────────────────────────────────────────────────────┐ │ FIXED SubFrame 完整位布局 │ ├─────────────────────────────────────────────────────┤ │ Header (8-13 bits): │ │ bit 0: zero_padding 0 │ │ bits 1-6: type 0x02-0x1F (FIXED order) │ │ bit 7: wasted_bits_flag │ │ bits 8-12: wasted_bits (if flag1) │ ├─────────────────────────────────────────────────────┤ │ Warmup Samples: │ │ order × bits_per_sample bits │ ├─────────────────────────────────────────────────────┤ │ Residual Data (Rice 编码): │ │ (blocksize - order) 个残差值 │ └─────────────────────────────────────────────────────┘音乐信号大多数音乐具有良好的相关性语音信号人声具有较强的预测性周期性信号乐器演奏的持续音FIXED 使用固定系数的线性预测系数由阶数决定Order预测公式系数0predictor 0无1predictor sample[n-1][1]2predictor 2×sample[n-1] - sample[n-2][2, -1]3predictor 3×sample[n-1] - 3×sample[n-2] sample[n-3][3, -3, 1]4predictor 4×sample[n-1] - 6×sample[n-2] 4×sample[n-3] - sample[n-4][4, -6, 4, -1]3.3.5LPC SubFrame线性预测编码┌─────────────────────────────────────────────────────┐ │ LPC SubFrame 完整位布局 │ ├─────────────────────────────────────────────────────┤ │ Header (17-22 bits): │ │ bit 0: zero_padding 0 │ │ bits 1-6: type 0x40-0x7F (LPC order) │ │ bit 7: wasted_bits_flag │ │ bits 8-12: wasted_bits (if flag1) │ │ bits 13-16: qlp_coeff_precision (4 bits) │ │ bits 17-21: quantization_level (5 bits) │ ├─────────────────────────────────────────────────────┤ │ LPC Coefficients: │ │ order × qlp_coeff_precision bits │ ├─────────────────────────────────────────────────────┤ │ Warmup Samples: │ │ order × bits_per_sample bits │ ├─────────────────────────────────────────────────────┤ │ Residual Data (Rice 编码): │ │ (blocksize - order) 个残差值 │ └─────────────────────────────────────────────────────┘LPC 使用自适应系数的线性预测预测公式: predictor[n] Σ(qlp_coeff[i] × sample[n-i-1]) / 2^quantization_level 残差计算: residual[n] actual[n] - predictor[n] 编码器使用自相关法计算 LPC 系数步骤: 1. 计算自相关函数 R[k] Σ(sample[i] × sample[ik]) 2. 解 Yule-Walker 方程得到 LPC 系数 3. 量化系数并确定精度