欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

解密H264、AAC硬件解碼的關(guān)鍵擴(kuò)展數(shù)據(jù)處理-創(chuàng)新互聯(lián)

通過上一篇文章,我們用ffmpeg分離出一個(gè)多媒體容器中的音視頻數(shù)據(jù),但是很可能這些數(shù)據(jù)是不能被正確解碼的。為什么呢?因?yàn)樵诮獯a這些數(shù)據(jù)之前,需要對(duì)×××做一些配置,典型的就是目前流行的高清編碼“黃金搭檔”組合H264 + AAC的搭配。本文將講述H264和AAC的關(guān)鍵解碼配置參數(shù)的解析,如果沒有這些配置信息,數(shù)據(jù)幀往往不完整,導(dǎo)致了×××不能解碼。

成都創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)營銷推廣、網(wǎng)站重做改版、望謨網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5、電子商務(wù)商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為望謨等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
  • H264的配置信息解析

    前面我們知道,ffmpeg的avformat_find_stream_info函數(shù)可以取得音視頻媒體多種,比如播放持續(xù)時(shí)間、音視頻壓縮格式、音軌信息、字幕信息、幀率、采樣率等。在信息結(jié)果中有一項(xiàng)擴(kuò)展數(shù)據(jù)描述(avcodec.h文件中):

解密H264、AAC硬件解碼的關(guān)鍵擴(kuò)展數(shù)據(jù)處理

         AVCodecContext定義如下:

解密H264、AAC硬件解碼的關(guān)鍵擴(kuò)展數(shù)據(jù)處理

    如果視頻流是H264,這個(gè)extradate里面就包含了H264的配置信息,這個(gè)擴(kuò)展數(shù)據(jù)有如下定義:

解密H264、AAC硬件解碼的關(guān)鍵擴(kuò)展數(shù)據(jù)處理

   詳細(xì)解釋可以參考“文檔。里面最重要的就是NAL長度和SPS,PPS數(shù)據(jù)和對(duì)應(yīng)的長度信息。對(duì)該數(shù)據(jù)的解析在ffmpeg里面有現(xiàn)成的函數(shù):ff_h364_decode_extradata,在我的項(xiàng)目里面是自己寫的擴(kuò)展數(shù)據(jù)解析。

  • AAC的配置信息解析及設(shè)置

    如果音頻數(shù)據(jù)是AAC流,在解碼時(shí)需要ADTS(Audio Data Transport Stream)頭部,不管是容器封裝還是流媒體,沒有這個(gè),一般都是不能播放的。很多朋友在做AAC流播放時(shí)遇到播不出聲音,很可能就是這個(gè)原因?qū)е隆?

    ADTS所需的數(shù)據(jù)仍然是放在上面的擴(kuò)展數(shù)據(jù)extradata中,我們需要先解碼這個(gè)擴(kuò)展數(shù)據(jù),然后再從解碼后的數(shù)據(jù)信息里面重新封裝成ADTS頭信息,加到每一幀AAC數(shù)據(jù)之前再送×××,這樣就可以正常解碼了。

    extradate數(shù)據(jù)定義如下:

     解密H264、AAC硬件解碼的關(guān)鍵擴(kuò)展數(shù)據(jù)處理

       詳細(xì)信息及說明請(qǐng)參考“ISO-IEC-14496-3 (Audio)”的AudioSpecificConfig部分。里面最重要的部分有采樣頻率、通道配置和音頻對(duì)象類型,這幾個(gè)一般都是AAC×××需要的配置參數(shù)。

       這個(gè)數(shù)據(jù)在ffmpeg中也有相應(yīng)的解碼函數(shù):avpriv_aac_parse_header。在我的項(xiàng)目中,我沒有使用這個(gè)函數(shù),而是自己實(shí)現(xiàn)的

typedef struct  

{

     int write_adts;  

      int objecttype;  

      int sample_rate_index;  

      int channel_conf;  

}ADTSContext;  

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;  

}  

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數(shù)據(jù)編碼為ADTS頭信息插入每一個(gè)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;  

}  

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;
}

 這個(gè)頭部是固定的7字節(jié)長度,所以可提前空出這7個(gè)字節(jié)供ADTS占用。

 通過以上對(duì)H264和AAC的擴(kuò)展數(shù)據(jù)處理,播放各種“黃金搭檔”的多媒體文件、流媒體、視頻點(diǎn)播等都應(yīng)該沒有問題了。

 想第一時(shí)間獲得更多原創(chuàng)文章,請(qǐng)關(guān)注個(gè)人微信公眾平臺(tái):程序員互動(dòng)聯(lián)盟(coder_online),掃一掃下方二維碼或者搜索微信號(hào)coder_online即可關(guān)注,里面有大量Android,Chromium,Linux等相關(guān)文章等著您,我們還可以在線交流。

解密H264、AAC硬件解碼的關(guān)鍵擴(kuò)展數(shù)據(jù)處理

       如需轉(zhuǎn)載本文,請(qǐng)注明出處:謝謝合作!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

分享文章:解密H264、AAC硬件解碼的關(guān)鍵擴(kuò)展數(shù)據(jù)處理-創(chuàng)新互聯(lián)
文章URL:http://aaarwkj.com/article10/ccdido.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、網(wǎng)站內(nèi)鏈、全網(wǎng)營銷推廣、做網(wǎng)站、響應(yīng)式網(wǎng)站、自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)
全国最大成人免费视频| 婷婷亚洲悠悠色悠在线| 在线亚洲av不卡一区二区三区| 四虎在线免费视频播放| 国产av不卡二区三区| 在线观看免费完整观看一区二区| 日本午夜福利免费在线播放| 国产老熟女高潮精品视频网站免费| 国产第一页第二页在线| 亚洲av产在线精品亚洲第| 欧洲亚洲国产一区二区| 人妻少妇中文字幕一区| 日本东京热二三四区不卡免费的| 婷婷中文字幕在线不卡视频| 日韩视频一区二区三区四区| 中文字幕人妻丝袜二区| 日韩精品一区二区91| 色偷偷91综合久久噜噜| 日日夜夜久久一二三区| 欧美色一区二区三区四区| 国产夫妻性生活视频播放| 丝袜美腿一区二区三区| 亚洲成色在线综合剧情网站| 国产白浆视频在线观看| 91超碰在线观看中文| 啊啊舒服爽用力爱我视频| 麻豆印象传媒在线观看| 国产三级三级三级av精品| 人妻中文字幕av资源| 熟女人妻视频一区二区| 真实夫妻露脸爱视频九色网| 成人欧美精品一区二区不卡| 国产传媒在线播放一区| 国产亚洲欧美日韩看国产| 韩国黄色理论片一区二区麻豆| 欧美日韩精品不卡在线播放| 亚洲一区二区三区蜜桃av| 韩国久久久久三级成人| 永久免费观看黄色录像| 福利视频免费观看欧美| 午夜少妇福利在线观看|