• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            AAC 格式分析

            轉(zhuǎn)載自:http://blog.chinaunix.net/uid-26084833-id-3416600.html

            一SADTS格式:

                   ADTS的全稱是Audio Data Transport Stream。是AAC音頻的傳輸流格式。

                   AAC音頻格式在MPEG-2ISO-13318-7 2003)中有定義。AAC后來又被采用到MPEG-4標(biāo)準(zhǔn)中。

                   1. adts_sequence()

                   {

                          while (nextbits() == syncword)

                          {

                                 adts_frame();

                          }

                   }

             

                   2. adts_frame()

                   {

                          adts_fixed_header();

                          adts_variable_header();

                          if (number_of_raw_data_blocks_in_frame == 0)

                          {

                                 adts_error_check();

                                 raw_data_block();

                          } else

                          {

                                 adts_header_error_check();

                                 for (i = 0; i <= number_of_raw_data_blocks_in_frame; i++)

                                 {

                                         raw_data_block();

                                         adts_raw_data_block_error_check();

                                 }

                          }

                   }

             

                   3. adts_fixed_header()

                   {

                          syncword: 12 bslbf

                          ID: 1 bslbf

                          layer: 2 uimsbf

                          protection_absent: 1 bslbf

                          profile: 2 uimsbf

                          sampling_frequency_index: 4 uimsbf

                          private_bit: 1 bslbf

                          channel_configuration: 3 uimsbf

                          original/copy: 1 bslbf

                          home: 1 bslbf

                   }

                  

                   adts_variable_header()

                   {

                          copyright_identification_bit: 1 bslbf

                          copyright_identification_start: 1 bslbf

                          frame_length: 13 bslbf

                          adts_buffer_fullness: 11 bslbf

                          number_of_raw_data_blocks_in_frame: 2 uimsfb

                   }

             

                   詳細(xì)說明下ADTS頭的重要數(shù)據(jù)部分:

                   syncword 同步字The bit string 1111 1111 1111,說明一個(gè)ADTS幀的開始。

                   ID    MPEG 標(biāo)示符, 設(shè)置為1.

                   layer Indicates which layer is used. Set to ‘00’

                   protection_absent 表示是否誤碼校驗(yàn)

                   profile 表示使用哪個(gè)級(jí)別的AAC,如01 Low Complexity(LC)--- AACLC

                   sampling_frequency_index 表示使用的采樣率下標(biāo)

                   sampling_frequency_index sampling frequeny [Hz]

                   0x0       96000

                   0x1           88200

                   0x2          64000

                   0x3          48000

                   0x4          44100

                   0x5          32000

                   0x6            24000

                   0x7          22050

                   0x8          16000

                   0x9          2000

                   0xa          11025

                   0xb          8000

                   0xc          reserved

                   0xd          reserved

                   0xe          reserved

                   0xf           reserved

                   channel_configuration 表示聲道數(shù)

                   frame_length 一個(gè)ADTS幀的長(zhǎng)度包括ADTS頭和raw data block.

                   adts_buffer_fullness  0x7FF 說明是碼率可變的碼流

                   number_of_raw_data_blocks_in_frame

                  表示ADTS幀中有number_of_raw_data_blocks_in_frame + 1個(gè)AAC原始幀.

                   所以說number_of_raw_data_blocks_in_frame == 0 表示說ADTS幀中有一個(gè)AAC數(shù)據(jù)塊并不是說沒有。(一個(gè)AAC原始幀包含一段時(shí)間內(nèi)1024個(gè)采樣及相關(guān)數(shù)據(jù))

            二 封裝AAC為ADTS幀 

                   一個(gè)AAC原始數(shù)據(jù)塊長(zhǎng)度是可變的,對(duì)原始幀加上ADTS頭進(jìn)行ADTS 的封裝,就形成了ADTS幀。通常我們將得到的AAC原始幀進(jìn)行封裝后寫入文件,用常用的播放器如千千靜聽即可播放,這是個(gè)驗(yàn)證AAC數(shù)據(jù)是否正確的方法。   

                   進(jìn)行封裝前,需要了解相關(guān)參數(shù),如采樣率,聲道數(shù),原始數(shù)據(jù)塊的長(zhǎng)度等。下面把AAC原始數(shù)據(jù)幀加工為ADTS幀,據(jù)相關(guān)參數(shù)填寫組成7字節(jié)的ADTS頭。

                   The ADTS header is defined below -    

                   unsigned int obj_type = 0;    

                   unsigned int num_data_block = frame_length / 1024; 

                   // include the header length also     

                   frame_length += 7;   

                   /* We want the same metadata */    

                   /* Generate ADTS header */    

                   if(adts_header == NULL) return;    

                   /* Sync point over a full byte */    

                   adts_header[0] = 0xFF;    

                   /* Sync point continued over first 4 bits + static 4 bits    

                  * (ID, layer, protection)*/    

                   adts_header[1] = 0xF9;    

                   /* Object type over first 2 bits */    

                   adts_header[2] = obj_type << 6;//    

                   /* rate index over next 4 bits */    

                   adts_header[2] |= (rate_idx << 2);    

                   /* channels over last 2 bits */    

                   adts_header[2] |= (channels & 0x4) >> 2;   

                   /* channels continued over next 2 bits + 4 bits at zero */    

                   adts_header[3] = (channels & 0x3) << 6;    

                   /* frame size over last 2 bits */    

                   adts_header[3] |= (frame_length & 0x1800) >> 11;    

                   /* frame size continued over full byte */    

                   adts_header[4] = (frame_length & 0x1FF8) >> 3;    

                   /* frame size continued first 3 bits */    

                   adts_header[5] = (frame_length & 0x7) << 5;    

                   /* buffer fullness (0x7FF for VBR) over 5 last bits*/    

                   adts_header[5] |= 0x1F;    

                   /* buffer fullness (0x7FF for VBR) continued over 6 first bits + 2 zeros     

                   * number of raw data blocks */

                   adts_header[6] = 0xFC;// one raw data blocks .

                   adts_header[6] |= num_data_block & 0x03; //Set raw Data blocks.

             

                   CMMB中,采用AAC音頻壓縮標(biāo)準(zhǔn),默認(rèn)狀況下,編碼參數(shù)如下:雙聲道,采樣率24KHZ,幀長(zhǎng)變長(zhǎng),碼流可變碼率的碼流,一般采用的AAC profile

            AAC-LC。將從CMMB復(fù)用幀解析的一個(gè)AAC原始幀封裝為ADTS幀的方法如下:

            uint8 aac_buf[ADTS_FRAME_SIZE]={0x0ff,0x0f9,0x058,0x80,0,0x1f,0xfc};

                   從上述7個(gè)字節(jié)分析音頻參數(shù)如下:

                   synword--0xfff

                   ID:0x1--- 1--- MPEG2 identifier,

                   LAYER--00

                   protection_absent ---01

                   profile--01   1 Low Complexity profile (LC) AAC-LC

                   smaping_freuency_index---0110-->0x06--->采樣率24KHZ 

                   channel_configuration --- aac_buf[3] = 0x08---->2---->雙聲道。。

                   adts_buffer_fullness--->0x7ff 碼率可變的碼流 

                   現(xiàn)插入長(zhǎng)度參數(shù) wDataLen;

                   void OnAudioAacFrame(byte* data, uint16 wDataLen)

                   {

                          unsigned int num_data_block = wDataLen / 1024; 

                          uint16 frame_Length; 

                          frame_Length = wDataLen + 7;     

                           /* frame size over last 2 bits */         

                          aac_buf[3] |= (frame_length & 0x1800) >> 11;// the upper 2 bit         

                          /* frame size continued over full byte */         

                          aac_buf[4] = (frame_length & 0x1FF8) >> 3;// the middle 8 bit        

                          /* frame size continued first 3 bits */         

                          aac_buf[5] |= (frame_length & 0x7) << 5;//the last 3 bit 

                          aac_bug[6] |= num_data_block & 0x03; //Set raw Data blocks.

                          emcpy(&aac_buf[7],data,wDataLen);

                          //形成一個(gè)ADTS幀寫入文件。

                          fwrite(aac_buf,wDataLen+7,sizeof(byte),f_audio);

                   }

            三 LATM格

                   LATM 的全稱為Low-overhead MPEG-4 Audio TransportMultiplex(低開銷音頻傳輸復(fù)用),是MPEG-4 AAC制定的一種高效率的碼流傳輸方式,MPEG-2 TS 流也采用LATM 作為AAC 音頻碼流的封裝格式之 LATM格式也以幀為單位,主要由AudioSpecificConfig(音頻特定配置單元)與音頻負(fù)載組成。

            AudioSpecificConfig 描述了一個(gè)LATM 幀的信息,音頻負(fù)載主要由PayloadLengthInfo(負(fù)載長(zhǎng)度信息)和PayloadMux(負(fù)載凈荷)組成。

                   AudioSpecificConfig 信息可以是帶內(nèi)傳,也可以是帶外傳。所謂帶內(nèi)傳,就是指每一個(gè)LATM 幀,都含有一個(gè)AudioSpecificConfig 信息;而帶外傳,

            則每一個(gè)LATM幀都不含有AudioSpecificConfig 信息,而通過其他方式把AudioSpecificConfig信息發(fā)送到解碼端,由于AudioSpecificConfig 信息一般是不變的,所以只需發(fā)送一次即可。由此可見,AudioSpecificConfig 信息采用帶內(nèi)傳輸可適應(yīng)音頻編碼信息不斷變化的情況,而采用帶外傳輸,可以節(jié)省音頻傳輸碼率。帶內(nèi)或帶外傳,由muxconfigPresent 標(biāo)志位決定。例如流媒體應(yīng)用中,muxconfigPresent 可設(shè)置為0,這樣LATM幀中將不含有AudioSpecificConfig信息,LATM幀通過RTP包發(fā)送出去,AudioSpecificConfig 可通過SDP文件一次性傳送到解碼端。

                   AudioSpecificConfig 主要參數(shù)

                   numSubFrames  子幀的數(shù)目

                   numProgram    復(fù)用的節(jié)目數(shù)

                   numLayer      復(fù)用的層數(shù)

                   frameLengthType  負(fù)載的幀長(zhǎng)度類型,包括固定長(zhǎng)度與可變長(zhǎng)度

                   audioObjectType   音頻對(duì)象類型

                   samplingFrequency   采樣率

                   channelConfiguration   聲道配置

                   音頻負(fù)載由若干子幀組成,每個(gè)子幀由PayloadLengthInfoPayloadMux組成,與ADTS幀凈荷一樣,音頻負(fù)載主要包含原始幀數(shù)據(jù)。 

                   AAC打包成TS流通常有兩種方式,分別是先打包成ADTSLATM。ADTS的每一幀都有個(gè)幀頭,在每個(gè)幀頭信息都一樣的狀況下,會(huì)有很大的冗余。LATM格式具有很大的靈活性,每幀的音頻配置單元既可以帶內(nèi)傳輸,有可以帶外傳輸。正因?yàn)槿绱耍?/span>LATM不僅適用于流傳輸還可以用于RTP傳輸,RTP傳輸時(shí),若音頻數(shù)據(jù)配置信息是保持不變,可以先通過SDP會(huì)話先傳輸StreamMuxConfigAudioSpecificConfig)信息,由于LATM流由一個(gè)包含了一個(gè)或多個(gè)音頻幀的audioMuxElements序列組成。一個(gè)完整或部分完整的audioMuxElement可直接映射到一個(gè)RTP負(fù)載上。 

                   下面是一個(gè)audoMuxEmlemt

                   AudioMuxElement(muxConfigPresent)

                   { 

                          if (muxConfigPresent)  

                          { 

                                 useSameStreamMux;    

                                 if (!useSameStreamMux)       

                                        StreamMuxConfig();

                         }

             

                          if (audioMuxVersionA == 0) 

                          { 

                                 for (i = 0; i <= numSubFrames; i++)    

                                 {

                                         PayloadLengthInfo();       

                                        PayloadMux();   

                                }.  

                          }

                   }

              

                   可以很簡(jiǎn)單的把ADTS幀轉(zhuǎn)換為LATM幀,根據(jù)ADTS頭的信息,生成StreamMuxConfig,將ADTS中的原始幀提取出來,前面加上PayloadLengthInfo做為LATM的音頻幀。按照上述格式打包生成AudioMuxElement,作為RTP的負(fù)載傳輸.

             

            四、 CMMB中的LATM 

             

                   當(dāng)CMMB中音頻壓縮標(biāo)準(zhǔn)為AAC時(shí),默認(rèn)采用LATM封裝。StreamMuxConfig采用帶外傳輸。StreamMuxConifg中的若干默認(rèn)參數(shù)如下:

                   audioMuxVersion:0標(biāo)志流語(yǔ)法版本號(hào)為0

                   allStreamSameTiemFraming1,標(biāo)志復(fù)用到PayLoadMux()中的所有負(fù)載共享一個(gè)共同的時(shí)基

                   umSubFrames:0  表示只有一個(gè)音頻子幀. 

                   audioObjectType:2 AAC-LC freameLengthType:0 幀長(zhǎng)度是可變的

                   latmBufferFullness:0xFF 碼率可變的碼流

             

            參考:

            [1]ISO/IEC 13818-7(2003 MPEG-2 AAC, Second Edition)

            [2] ISO13818-72006 Fourth edition AAC

            [3] RFC 3016 (rfc3016) - RTP Payload Format for MPEG-4 Audio-Visual Streams

            [4] AAC音頻壓縮編碼標(biāo)準(zhǔn)的ADTSLATM格式分析

            [5] GYZ 234-2008 CMMB復(fù)用實(shí)施指南




            posted on 2013-02-05 13:49 楊粼波 閱讀(3283) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久精品中文字幕第23页| 久久久久久久综合日本| 伊人久久久AV老熟妇色| 久久精品这里只有精99品| 蜜桃麻豆www久久| 亚洲精品tv久久久久久久久久| 国产高潮国产高潮久久久91 | 久久久久久久女国产乱让韩| 国产伊人久久| 欧美一区二区三区久久综| 亚洲色欲久久久综合网| 亚洲中文字幕无码一久久区| 国产精品久久久久久久久软件| 日韩电影久久久被窝网| 欧美久久一区二区三区| 午夜福利91久久福利| 一本久久a久久精品综合香蕉| 久久免费视频一区| 国产69精品久久久久9999APGF| 国产精品久久久久久一区二区三区| 久久无码人妻一区二区三区午夜 | 久久久青草青青亚洲国产免观| 91精品国产综合久久久久久| 国产精品久久久久久久久鸭| 亚洲国产精品久久久久久| 老司机国内精品久久久久| 精品久久久久久国产牛牛app| 久久精品成人欧美大片| 性高湖久久久久久久久AAAAA| 久久亚洲精品国产精品婷婷| 99久久国产精品免费一区二区| 伊人久久大香线焦AV综合影院 | 99久久精品国产麻豆| 99久久无码一区人妻| 久久本道久久综合伊人| 亚洲日本va午夜中文字幕久久| 久久久久国产精品嫩草影院| 久久综合香蕉国产蜜臀AV| 久久99国产精品久久| 久久精品国产只有精品66| 2019久久久高清456|