解密H264、AAC硬體解碼的關鍵擴充資料處理

來源:互聯網
上載者:User

標籤:

    通過上一篇文章,我們用ffmpeg分離出一個多媒體容器中的音視頻資料,但是很可能這些資料是不能被正確解碼的。為什麼呢?因為在解碼這些資料之前,需要對解碼器做一些配置,典型的就是目前流行的高清編碼“黃金搭檔”組合H264 + AAC的搭配。本文將講述H264和AAC的關鍵解碼配置參數的解析,如果沒有這些配置資訊,資料幀往往不完整,導致瞭解碼器不能解碼。

  • H264的配置資訊解析

    前面我們知道,ffmpeg的avformat_find_stream_info函數可以取得音視頻媒體多種,比如播放期間、音視頻壓縮格式、音軌資訊、字幕資訊、幀率、採樣率等。在資訊結果中有一項擴充資料描述(avcodec.h檔案中):

          AVCodecContext定義如下:

    如果視頻流是H264,這個extradate裡面就包含了H264的配置資訊,這個擴充資料有如下定義:

    詳細解釋可以參考“ISO-14496-15 AVC file format”文檔。裡面最重要的就是NAL長度和SPS,PPS資料和對應的長度資訊。對該資料的解析在ffmpeg裡面有現成的函數:ff_h264_decode_extradata,在我的項目裡面是自己寫的擴充資料解析。

  • AAC的配置資訊解析及設定

    如果音頻資料是AAC流,在解碼時需要ADTS(Audio Data Transport Stream)頭部,不管是容器封裝還是流媒體,沒有這個,一般都是不能播放的。很多朋友在做AAC流播放時遇到播不出聲音,很可能就是這個原因導致。

    ADTS所需的資料仍然是放在上面的擴充資料extradata中,我們需要先解碼這個擴充資料,然後再從解碼後的資料資訊裡面重新封裝成ADTS頭資訊,加到每一幀AAC資料之前再送解碼器,這樣就可以正常解碼了。

    extradate資料定義如下:

        詳細資料及說明請參考“ISO-IEC-14496-3 (Audio)”的AudioSpecificConfig部分。裡面最重要的部分有採樣頻率、通道配置和音頻物件類型,這幾個一般都是AAC解碼器需要的配置參數。

        這個資料在ffmpeg中也有相應的解碼函數:avpriv_aac_parse_header。在我的項目中,我沒有使用這個函數,而是自己實現的:

typedef struct{   int write_adts;   int objecttype;   int sample_rate_index;   int channel_conf;}ADTSContext;

 

 

int aac_decode_extradata(ADTSContext *adts, unsigned char *pbuf, int bufsize){      int aot, aotext, samfreindex;      int i, channelconfig;      unsigned char *p = pbuf;       if (!adts || !pbuf || bufsize<2)      {            return -1;      }      aot = (p[0]>>3)&0x1f;      if (aot == 31)      {            aotext = (p[0]<<3 | (p[1]>>5)) & 0x3f;            aot = 32 + aotext;            samfreindex = (p[1]>>1) & 0x0f;                       if (samfreindex == 0x0f)            {                  channelconfig = ((p[4]<<3) | (p[5]>>5)) & 0x0f;            }            else            {                  channelconfig = ((p[1]<<3)|(p[2]>>5)) & 0x0f;            }      }      else      {            samfreindex = ((p[0]<<1)|p[1]>>7) & 0x0f;            if (samfreindex == 0x0f)            {                  channelconfig = (p[4]>>3) & 0x0f;            }            else            {                  channelconfig = (p[1]>>3) & 0x0f;            }      } #ifdef AOT_PROFILE_CTRL      if (aot < 2) aot = 2;#endif      adts->objecttype = aot-1;      adts->sample_rate_index = samfreindex;      adts->channel_conf = channelconfig;      adts->write_adts = 1;       return 0;}

 

          上面的pbuf就是extradata。

       接下來,再用ADTSContext資料編碼為ADTS頭資訊插入每一個AAC幀前面:

int aac_set_adts_head(ADTSContext *acfg, unsigned char *buf, int size){             unsigned char byte;       if (size < ADTS_HEADER_SIZE)      {            return -1;      }           buf[0] = 0xff;      buf[1] = 0xf1;      byte = 0;      byte |= (acfg->objecttype & 0x03) << 6;      byte |= (acfg->sample_rate_index & 0x0f) << 2;      byte |= (acfg->channel_conf & 0x07) >> 2;      buf[2] = byte;      byte = 0;      byte |= (acfg->channel_conf & 0x07) << 6;      byte |= (ADTS_HEADER_SIZE + size) >> 11;      buf[3] = byte;      byte = 0;      byte |= (ADTS_HEADER_SIZE + size) >> 3;      buf[4] = byte;      byte = 0;      byte |= ((ADTS_HEADER_SIZE + size) & 0x7) << 5;      byte |= (0x7ff >> 6) & 0x1f;      buf[5] = byte;      byte = 0;      byte |= (0x7ff & 0x3f) << 2;      buf[6] = byte;       return 0;}

 

  這個頭部是固定的7位元組長度,所以可提前空出這7個位元組供ADTS佔用。

  通過以上對H264和AAC的擴充資料處理,播放各種“黃金搭檔”的多媒體檔案、流媒體、ApsaraVideo for VOD等都應該沒有問題了。

 

  想第一時間獲得更多原創文章,請關注個人公眾平台:程式員互動聯盟(coder_online),掃一掃下方二維碼或者搜尋號coder_online即可關注,裡面有大量Android,Chromium,Linux等相關文章等著您,我們還可以線上交流。

 

        如需轉載本文,請註明出處:謝謝合作!

解密H264、AAC硬體解碼的關鍵擴充資料處理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.