关于可变长度编码及AAC标准中hcod_sf的比特读取问题咨询
AAC编码:可变长度编码比特数与hcod_sf解析问题
1. 可变长度编码(Variable Length Coding)需要读取多少比特?
其实没有固定数值——AAC里的可变长度编码(大多基于霍夫曼编码实现)是动态长度的,完全取决于当前要解析的符号对应的码表条目。
举个实际例子:AAC的霍夫曼码表会给出现频率高的符号分配短编码(比如2-4比特),低频符号则用更长的编码(甚至超过10比特)。解析时你得从比特流里逐位读取,直到匹配到码表中某个完整的符号编码为止,此时读取的比特数就是这个符号的VLC长度。
说白了,每个VLC符号的比特数是跟着它的码表走的,没有统一的固定值。
2. 如何确定hcod_sf需读取的比特数?1..19代表什么?
先明确:hcod_sf是AAC中专门给**缩放因子(Scale Factor)**用的霍夫曼编码,它的比特数确定逻辑和对应的码表直接绑定:
- 首先得对照AAC ISO标准里定义的
hcod_sf霍夫曼码表(一般在缩放因子编码的章节),码表会列出每个可能的缩放因子符号对应的二进制编码,以及这个编码的比特长度。 - 解析时,你从比特流逐位累积读取,直到匹配到码表中
hcod_sf的某个有效编码,此时累积的比特数就是这个hcod_sf需要读取的长度。
至于1..19,这是缩放因子的有效索引范围:
AAC的缩放因子会被映射到1到19之间的整数索引,每个索引对应一组特定的缩放因子计算规则,同时也对应hcod_sf码表中的一个条目。不同索引的出现频率不同,所以码表给高频索引分配了更短的编码,低频索引用更长的编码,以此优化压缩效率。比如索引1对应的编码可能只有3比特,而索引19的编码可能要8比特左右(具体以标准里的码表为准)。
内容的提问来源于stack exchange,提问作者Malik Urac
相关产品推荐
相关产品推荐

