AAC在对PCM数据进行编码时,使用window取出1024或128个数据进行MDCT转换到频域。

Window的相关信息记录在ics_info中:

关于ics_info中各个字段的含义如下

window sequence的类别如Table 44,long_sequence/start_sequence/stop_sequence包含1个window,short_sequence包含8个short window。

在一个window中包含的scalefactor band 依赖于fs.

对于48k来说long_window/long_start_window/long_stop_window中包含49个scalfactor band.window中的 频谱系数个数为1024.

而short window中包含14个scalefactor band,short window中的频谱系数个数为128.

Table 45为long_window的scalefactor band信息。

Scalefactor:Factor by which a set of values is scaled before quantization.
Scalefactor band:A set of spectral coefficients which are scaled by one scalefactor.

The basic method to adjust the quantization noise in the frequency domain is the noise shaping using scalefactors. For this purpose the spectrum is divided in several groups of spectral coefficients called scalefactor bands which share one scalefactor (see subclause 8.3.4). A scalefactor represents a gain value which is used to change the amplitude of all spectral coefficients in that scalefactor band. This mechanism is used to change the allocation of the quantization noise in the spectral domain generated by the non uniform
quantizer.

The width of the scalefactor bands is built in imitation of the critical bands of the human auditory system. For that reason the number of scalefactor bands in a spectrum and their width depend on the transform length and the sampling frequency.

The spectral coefficients are divided into scalefactor bands that contain a multiple of 4 quantized spectral coefficients. Each scalefactor band has a scalefactor.

num_swb_long_window:long window中scalefactor band的个数。

swb:window中scalefactor band的index.

swb_offset_long_window:long window中,scalefactor band中最小频谱系数的index。比如第0个scalefactor band包含4个频谱系数,最小频谱系数的index为0,那第一个scalefactor band的最小频谱系数的index为4.

window信息相关的字段含义如下:

对于long_sequence而言,window group为1,window group中只包含一个window.

对于short_sequence而言,可能包含多个window group,但所有window group中包含的window总数为8,window group信息和每个window group包含的window个数信息由scale factor_grouping算出。

下面是short window grouping的example.

包含4个window group, group划分由grouping_bits决定,当bit为1时,当前window在同一个window group中,window_group_length 加1,如果bit为0,当前window是在一个新的window group中,num_window_groups 加1,window_group_length等于1.

为进一步提高压缩率,AAC将一个window group中的所有的scalefactor band划分为几个section,每个section使用同一个huffman codebook.

Note that the length of a section is given in scalefactor bands rather than scalefactor window bands

section的划分使得原本码流的层次结构[g][win][sfb][coeff]变成[g][sect][sfb][coeff]

section划分信息包含在section_data()中:

sect_cb[g][i]: group g的第i个huffman table.

sect_len:section中包含的scalefactor个数。

sect_len_incr:用于计算sect_len的字段,short window为3 bit, long_window为5bit。当sect_len_incr==sect_esc_val时,sect_len加sect_esc_val.

sect_start/sect_end:表示当前section的起始和结束的scalfactor的index。sect_start和sect_end之间的scalefactor使用同一个huffman table.

num_sec[g]:group中section的个数。

scalefactor是在频域调节量化后带来的noise最基本的方法。为了这个目的,频谱被分为几个scalefactor band,每一个scalefactor band使用一个scalefactor.

scalefactor 是scalefactor band中频谱系数的gain value。

scalefactor的信息在scale_factor_data()中获取。

hcod_sf为scalefactor的codeword.

dpcm_sf为差分后的scalefactor.

scalefactor是采用差分方式进行编码的,即第一个scalefactor减去global_gain后编码,其后的scalefactor减去前一个scalefactor后编码。

scalefactor解码过程如下:

在码流信息中获取到scalfactor的codeword后,查找huffman codebook,获取到codeword的index,差分后的scalefactor为index-index_offset. index_offset固定为-60.

频谱系数信息包含在spectral_data()中:

hcod为编码4/2元组频谱系数的codeword。

在码流中读出频谱系数的codeword后,查huffman codebook,获取到codeword对应的index, 通过index可以计算出量化后的频谱系数(w,x,y,z),最大的量化频谱系数为8192

huffman解码出来的量化的频谱系数,需要进行反量化:

反量化的过程如下:

反量化的频谱系数为通过scalefactor进行scale后的频谱系数,在解码时,需要rescale还原真正的频谱系数x_rescale。

gain和scalefactor之间的关系为:

AAC 码流信息分析的更多相关文章

  1. 【雷神源码解析】无基础看懂AAC码流解析,看不懂你打我

    一 前言 最近在尝试学习一些视频相关的知识,随便一搜才知道原来国内有雷神这么一个真正神级的人物存在,尤其是在这里(传送门)看到他的感言更是对他膜拜不已,雷神这种无私奉献的精神应当被我辈发扬光大.那写这 ...

  2. H264码流打包分析(精华)

    H264码流打包分析 SODB 数据比特串-->最原始的编码数据 RBSP 原始字节序列载荷-->在SODB的后面填加了结尾比特(RBSP trailing bits 一个bit“1”)若 ...

  3. (转)MPEG4码流简单分析

    把MPEG4码流的分析和它的I,P,B Frame的判定方法在这里简要记录一下吧,供日后的翻看和大家的参考.   测试解码器测试了很久,由于需要将H264和MPEG4的码流进行分析和判断,并逐帧输入解 ...

  4. 【转】打包AAC码流到FLV文件

    AAC编码后数据打包到FLV很简单.1. FLV音频Tag格式                              字节位置    意义0x08,                         ...

  5. H264码流打包分析

    转自:http://www.360doc.com/content/13/0124/08/9008018_262076786.shtml   SODB 数据比特串-->最原始的编码数据 RBSP ...

  6. 将h264和aac码流合成flv文件

    在视频应用中,经常需要将接收到h264和aac数据保存成文件. 本来想用mp4格式,但是mp4在没有正常关闭的情况下会导致文件打不开,而在实际应用中经常会出现设备直接拔电,程序不是正常结束的情况.于是 ...

  7. 打包AAC码流到FLV文件

    AAC编码后数据打包到FLV很简单. 1. FLV音频Tag格式                              字节位置    意义0x08,                       ...

  8. aac adts & LATM封装码流分析

    本文继续上一篇文章的内容,介绍一个音频码流处理程序.音频码流在视频播放器中的位置如下所示. 本文中的程序是一个AAC码流解析程序.该程序可以从AAC码流中分析得到它的基本单元ADTS frame,并且 ...

  9. 视音频数据处理入门:AAC音频码流解析

    ===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB.YUV像素数据处理 视音频数据处理 ...

随机推荐

  1. STL与基本数据结构

    目录 Vector list -- 链表 Stack -- 栈 queue -- 队列 优先队列 -- priority_ queue set -- 集合 multiset map 这是我第一次用Ma ...

  2. 4.Docker Compose 部署 Nexus

    什么是 Nexus Nexus 是一个强大的 Maven 仓库管理器,极大地简化了内部仓库的维护和外部仓库的访问.2016 年 4 月 6 日 Nexus 3.0 版本发布,相较 2.x 版本有了很大 ...

  3. 0级搭建类005-Oracle Solaris Unix安装 (11.4) 公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...

  4. [转]从实例谈OOP、工厂模式和重构

    有了翅膀才能飞,欠缺灵活的代码就象冻坏了翅膀的鸟儿.不能飞翔,就少了几许灵动的气韵.我们需要给代码带去温暖的阳光,让僵冷的翅膀重新飞起来.结合实例,通过应用OOP.设计模式和重构,你会看到代码是怎样一 ...

  5. Qt Installer Framework翻译(7-8)

    C++ API C ++ API文档是为开发Qt Installer Framework的开发人员编写的. 它描述了内部API,因此没有兼容性保证. 此外,该文档尚在开发中,因此缺少部分内容,而其他部 ...

  6. linux-mysql-主从同步

    什么是二进制日志binlog:记录着mysql数据库中的一些写入性操作,比如一些增删改,但不包括查询!二进制日志有哪些功能:数据复制和数据恢复的功能 查看网络状态:netstat -natp查看mas ...

  7. FatMouse and Cheese HDU - 1078 dp

    #include<cstdio> #include<iostream> #include<cstring> using namespace std; int n,k ...

  8. Wannafly Camp 2020 Day 6N. 合并!

    #include <bits/stdc++.h> using namespace std; int n,a[2005]; int main() { long long ans=0; cin ...

  9. MySQL 中like的使用对于索引的影响

    今天看了一篇对于like使用对索引的影响的文章,发现自己实践的跟文章得出结论不大一样.所以还是建议自己再看别人文章的时候自己亲自动手实践一下.以免学到不全面的知识. 列子: 先建立一张表: -- 创建 ...

  10. C++——标准模板库

    1.泛型程序设计:将程序尽可能写的通用,将算法从特定的数据结构中抽象出来,成为通用的:C++模板为泛型程序设计奠定了关键的基础:STL是泛型程序设计的一个范例:容器container.迭代器itera ...