当前位置: 代码迷 >> Android >> android 2.3 stagefright 增多AAC ADTS格式支持
  详细解决方案

android 2.3 stagefright 增多AAC ADTS格式支持

热度:102   发布时间:2016-05-01 19:21:05.0
android 2.3 stagefright 增加AAC ADTS格式支持

问题

加入 aac adts 文件

分析

Google的源代码已经有AACDecoder,只需要加入相应的AACAdtsExtractor

?

ADTS 头可以参考 ffmpeg 的相关代码

?

libavcodec/aacadtsdec.hlibavcodec/aacadtsdec.clibavformat/aacdec.c

晕,Android 4.0 已经支持了 AAC_ADTS 封装的 raw aac, diff 一下代码,拷贝过来,收工。

?

frameworks/base/include/media/stagefright/MediaDefs.h------------------------------------extern const char *MEDIA_MIMETYPE_AUDIO_AAC_ADTS;frameworks/base/media/libstagefright/include/------------------------------------add file AACExtractor.h from 4.0frameworks/base/media/libstagefright/include/avc_utils.h------------------------------------sp<MetaData> MakeAACCodecSpecificData(        unsigned profile, unsigned sampling_freq_index,        unsigned channel_configuration);        frameworks/base/media/libstagefright/------------------------------------add file AACExtractor.cpp from 4.0frameworks/base/media/libstagefright/Android.mk------------------------------------        AACExtractor.cpp                  \        frameworks/base/media/libstagefright/DataSource.cpp------------------------------------#include "include/AACExtractor.h"	RegisterSniffer(SniffAAC);	frameworks/base/media/libstagefright/MediaDefs.cpp------------------------------------const char *MEDIA_MIMETYPE_AUDIO_AAC_ADTS = "audio/aac-adts";frameworks/base/media/libstagefright/MediaExtractor.cpp------------------------------------#include "include/AACExtractor.h"else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC_ADTS)) {        return new AACExtractor(source);    }     frameworks/base/media/libstagefright/avc_utils.cpp------------------------------------sp<MetaData> MakeAACCodecSpecificData(        unsigned profile, unsigned sampling_freq_index,        unsigned channel_configuration) {    sp<MetaData> meta = new MetaData;    meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AAC);    CHECK_LE(sampling_freq_index, 11u);    static const int32_t kSamplingFreq[] = {        96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050,        16000, 12000, 11025, 8000    };    meta->setInt32(kKeySampleRate, kSamplingFreq[sampling_freq_index]);    meta->setInt32(kKeyChannelCount, channel_configuration);    static const uint8_t kStaticESDS[] = {        0x03, 22,        0x00, 0x00,     // ES_ID        0x00,           // streamDependenceFlag, URL_Flag, OCRstreamFlag        0x04, 17,        0x40,                       // Audio ISO/IEC 14496-3        0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00,        0x05, 2,        // AudioSpecificInfo follows        // oooo offf fccc c000        // o - audioObjectType        // f - samplingFreqIndex        // c - channelConfig    };    sp<ABuffer> csd = new ABuffer(sizeof(kStaticESDS) + 2);    memcpy(csd->data(), kStaticESDS, sizeof(kStaticESDS));    csd->data()[sizeof(kStaticESDS)] =        ((profile + 1) << 3) | (sampling_freq_index >> 1);    csd->data()[sizeof(kStaticESDS) + 1] =        ((sampling_freq_index << 7) & 0x80) | (channel_configuration << 3);    meta->setData(kKeyESDS, 0, csd->data(), csd->size());    return meta;}
?

?

参考

  • http://groups.google.com/group/android-contrib/browse_thread/thread/cd15305de25b1f9b/7d83b481eb3fd448
  • http://topic.csdn.net/u/20080508/09/79a11f48-9b7f-4ce6-baeb-b20636a7cd24.html

ADTS帧格式
Table 5 – Syntax of adts_frame()Syntax No. of bits Mnemonicadts_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();    }  }}Table 8 – Syntax of adts_fixed_header()Syntax No. of bits Mnemonicadts_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}Table 9 – Syntax of adts_variable_header()Syntax No. of bits Mnemonicadts_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}
?
  相关解决方案