问题
加入 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}?