亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

解密硬件解碼關鍵技術

2024-06-28 13:21:05
字體:
來源:轉載
供稿:網友
解密硬件解碼關鍵技術

通過上一篇文章,我們用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的擴展數據處理,播放各種“黃金搭檔”的多媒體文件、流媒體、視頻點播等都應該沒有問題了。

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

    摘自:http://my.oschina.net/u/2336532/blog/400790


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美高清视频在线观看| 2019中文在线观看| 国产免费观看久久黄| 日韩欧美福利视频| 亚洲人成77777在线观看网| 亚洲天堂av高清| 中文字幕欧美日韩精品| 久久精品中文字幕| 欧美精品久久久久久久| 国产成人拍精品视频午夜网站| 亚洲国产另类 国产精品国产免费| 欧美激情日韩图片| 久久免费福利视频| www.亚洲男人天堂| 日韩精品中文字幕久久臀| 日韩电影免费观看在线观看| 福利精品视频在线| 国产91在线视频| 欧美日韩国产丝袜另类| 欧美国产乱视频| 国产欧美一区二区三区在线| xxx一区二区| 亚洲精品日韩激情在线电影| 亚洲国产高清福利视频| 91av视频在线免费观看| 精品综合久久久久久97| 亚洲自拍中文字幕| 欧美中文在线观看国产| 亚洲精品在线看| 欧美一级大胆视频| 亚洲风情亚aⅴ在线发布| 成人做爰www免费看视频网站| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久久免费观看视频| 国产精品电影在线观看| 日韩av免费看网站| 国产精品久久久久久久久久久久久| 亚洲aⅴ男人的天堂在线观看| 色综合久久天天综线观看| 国产欧美精品xxxx另类| 丰满岳妇乱一区二区三区| 国产成人精品av在线| 91精品久久久久久综合乱菊| 美女撒尿一区二区三区| 国内精品久久久久| 精品久久久久久久久中文字幕| 亚洲精品久久久久中文字幕欢迎你| 91av视频在线免费观看| 伊人男人综合视频网| 国产精品久久久久久久久借妻| 久久精品成人一区二区三区| 精品亚洲精品福利线在观看| 日韩欧美中文在线| 中文字幕日本欧美| 欧美在线视频一二三| 亚洲国产精品小视频| 国产精品高清网站| 亚洲欧美一区二区精品久久久| 国产日韩在线亚洲字幕中文| 国产色视频一区| 在线成人一区二区| 北条麻妃99精品青青久久| 中文字幕亚洲欧美日韩2019| 91黑丝在线观看| 欧美激情2020午夜免费观看| 欧美一性一乱一交一视频| 亚洲欧美激情一区| 色与欲影视天天看综合网| 91精品国产91久久久久久不卡| 免费91在线视频| 欧美精品免费看| 久久成人精品一区二区三区| 亚洲精品一区二区三区不| 亚洲国产女人aaa毛片在线| 国产精品一区二区三区在线播放| 中文字幕亚洲色图| 欧美国产精品va在线观看| 亚洲午夜久久久影院| 日韩在线观看免费全| 亚洲国产欧美自拍| 亚洲国产精品99| 91视频免费在线| 亚洲r级在线观看| 国产深夜精品福利| 久久久综合免费视频| 久久久精品2019中文字幕神马| 在线亚洲欧美视频| 国产精品丝袜白浆摸在线| 亚洲电影免费观看高清完整版| 欧美另类99xxxxx| 狠狠躁夜夜躁人人爽超碰91| 国产免费一区视频观看免费| 亚洲成人免费在线视频| 久久成人在线视频| 亚洲专区在线视频| 亚洲v日韩v综合v精品v| 欧美日韩在线视频首页| 日本久久亚洲电影| 久久精品亚洲热| 日韩精品在线播放| 亚洲精品成人久久电影| 亚洲天堂一区二区三区| 久久精品视频导航| 久久91亚洲人成电影网站| 欧洲日本亚洲国产区| 亚洲欧美一区二区精品久久久| 国产国语刺激对白av不卡| 亚洲视频在线观看网站| 久久久久久亚洲精品| 久热精品视频在线免费观看| 日韩欧美精品免费在线| 色妞欧美日韩在线| 成人午夜在线视频一区| 国产91精品网站| 最新国产精品亚洲| 51精品国产黑色丝袜高跟鞋| 91精品国产91久久久久久吃药| 久久国产加勒比精品无码| 国产精品欧美久久久| 国产精品日韩在线播放| 欧美日韩国产成人在线观看| 91av在线精品| 日韩在线视频免费观看高清中文| 国产不卡一区二区在线播放| 狠狠躁夜夜躁人人爽超碰91| 国产精品中文字幕在线| 国产欧美日韩91| 亚洲成色777777在线观看影院| 久久久av亚洲男天堂| 欧美高清videos高潮hd| 91久久夜色精品国产网站| 亚洲精品久久在线| 青青在线视频一区二区三区| 国产一区二区三区精品久久久| 亚洲国产婷婷香蕉久久久久久| 久久视频免费在线播放| 亚洲福利在线播放| 91精品视频在线播放| 亚洲女人被黑人巨大进入al| 欧美在线不卡区| 日韩视频―中文字幕| 97在线看福利| 一本大道香蕉久在线播放29| 日韩成人黄色av| 精品久久久久久久久久久久久| 欧美乱大交xxxxx| 成人久久一区二区| 欧美精品九九久久| 91最新在线免费观看| 欧美激情一区二区三级高清视频| 国产精品av电影| 日韩精品高清在线观看| 色综合久久88| 欧美国产日韩精品| 国产精品一区二区三区久久| 国产日本欧美一区二区三区在线| 日产精品99久久久久久| 国产精品96久久久久久又黄又硬| 国产乱人伦真实精品视频| 综合国产在线观看| 亚洲自拍高清视频网站| 亚洲精品自产拍| 91精品视频在线看| 国产大片精品免费永久看nba|