zoukankan      html  css  js  c++  java
  • AAC音频格式 ---- ADTS

    基础:

    AAC⾳频格式:Advanced Audio Coding(⾼级⾳频解码),是⼀种由MPEG-4标准定义的有损⾳频压缩格式,由Fraunhofer发展,Dolby, Sony和AT&T是主要的贡献者。

    AAC音频格式分两种:ADIF和ADTS:

    ADIFAudio Data Interchange Format ⾳频数据交换格式。这种格式的特征是可以确定的找到这个⾳频数据的开始,不需进⾏在⾳频数据流中间开始的解码,即它的解码必须在明确定义的开始处进⾏。故这种格式常⽤在磁盘
    ⽂件中。
    ADTSAudio Data Transport Stream。是AAC⾳频的传输流格式。AAC⾳频格式在MPEG-2(ISO-13318-7 2003)中有定义。AAC后来⼜被采⽤到MPEG-4标准中。这种格式的特征是它是⼀个有同步字的⽐特流,解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。

    简单说,ADTS可以在任意帧解码,也就是说它每⼀帧都有头信息。ADIF只有⼀个统⼀的头,所以必须得到所有的数据后解码。且这两种的header的格式也是不同的,⽬前⼀般编码后的和抽取出的都是ADTS格式的⾳频流。两者具体的组织结构如下所示:

    ADIF格式

     ADTS格式(空白处表示前后帧):

    AAC(ADTS)音频结构: 

    每⼀帧的ADTS的头⽂件都包含了⾳频的采样率,声道,帧⻓度等信息,这样解码器才能解析读取。
    ⼀般情况下ADTS的头信息都是7个字节,分为2部分:

    • adts_fixed_header();
    • adts_variable_header();

    其⼀为固定头信息,紧接着是可变头信息。固定头信息中的数据每⼀帧都相同,⽽可变头信息则在帧与帧之间可变。

    adts_fixed_header:

    syncword:同步头 总是0xFFF, all bits must be 1,代表着⼀个ADTS帧的开始
    ID:MPEG标识符,0标识MPEG-4,1标识MPEG-2
    Layer:always: '00'
    protection_absent:表示是否误码校验。Warning, set to 1 if there is no CRC and 0 if there is CRC
    profile:表示使⽤哪个级别的AAC,如01 Low Complexity(LC)--- AAC LC。有些芯⽚只⽀持AAC LC 。

    在MPEG-2 AAC中定义了3种:

    index profile
    0 Main profile
    1 Low Complexity profile (LC)
    2 Scalable Sampling Rate profile (SSR)
    3 (reserved)

    sampling_frequency_index:表示使⽤的采样率下标,通过这个下标在Sampling Frequencies[ ]数组中查找得知采样率的值。

    Sampling Frequency Index Value
    0x0 96000
    0x1 88200
    0x2 64000
    0x3 48000
    0x4 44100
    0x5 32000
    0x6 24000
    0x7 22050
    0x8 16000
    0x9 12000
    0xa 11025
    0xb 8000
    0xc 7350
    0xd reserved
    0xe reserved
    0xf escape value

     

     channel_configuration: 表示声道数,⽐如2表示⽴体声双声道

    adts_variable_header:

    frame_length : ⼀个ADTS帧的⻓度包括ADTS头和AAC原始流.
      aac_frame_length = (protection_absent == 1 ? 7 : 9) + size(AACFrame)
      protection_absent=0时, header length=9bytes
      protection_absent=1时, header length=7bytes
    adts_buffer_fullness:0x7FF 说明是码率可变的码流。
    number_of_raw_data_blocks_in_frame:表示ADTS帧中有number_of_raw_data_blocks_in_frame + 1个AAC原始帧。
    所以说number_of_raw_data_blocks_in_frame == 0 表示说ADTS帧中有⼀个AAC数据块。

    下⾯是ADTS的AAC⽂件部分:
    ⾼字节开始算

    第⼀帧的帧头7个字节为:0xFF 0xF1 0x4C 0x40 0x20 0xFF 0xFC
    分析各个关键数值:
    111111111111
    0
    00
    1
    01
    0011
    0
    001
    0
    0
    0
    0
    0000100000111(帧⻓度)
    11111111111
    00
    计算帧⻓度:将⼆进制 0000100000111 转换成⼗进制为263。观察第⼀帧的⻓
    度确实为263个字节。
    计算⽅法:(帧⻓度为13位,使⽤unsigned int来存储帧⻓数值)

    unsigned int getFrameLength(unsigned char* str)
    {
      if ( !str )
      {
        return 0;
      }
      unsigned
    int len = 0;   int f_bit = str[3];   int m_bit = str[4];   int b_bit = str[5];   len += (b_bit>>5);   len += (m_bit<<3);   len += ((f_bit&3)<<11);   return len; }
  • 相关阅读:
    近期学习情况
    java连接数据库的两种方法总结
    近两个星期学习成果
    云笔记第一阶段总结
    圆面积
    C++计算器项目的初始部分
    C++视频课程
    A+B Format
    大一下学期的自我目标
    Kohana的请求流
  • 原文地址:https://www.cnblogs.com/vczf/p/13546486.html
Copyright © 2011-2022 走看看