IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> android mediacode 解码aac -> 正文阅读

[移动开发]android mediacode 解码aac

目录

主要流程:

mediacode解码aac:

mediacode参数?"csd-0",如何设定?


这里手动解析 aac文件,如果只是本地播放aac文件那么android已经有完善的方法:MediaExtractor + MediaCoddec 或者直接是MediaPlayer, 但有的时候我们有自己的aac帧数据,想利用Mediacode进行解码,里面就有些坑。
完整app源码:github?https://github.com/Canok7/openScreen/tree/main/clientAndroid/AACPlayer

主要流程:

1.这里写了个aac文件的解析类,解析aac-adts文件,从中读取 音频信息如:通道,采样率,编码等级等信息。2.然后从aac文件中逐步取出aac raw (去掉adts头的数据),送到mediacode解码(ndk),3.再将解码的pcm数据调用java的audioTrack(也可以采用opensl 直接在native层渲染,只是ndk还没有开放提供audioTrack的接口,所以这里使用native反过来调用java的audioTrack接口。vlc也是如此

解析aac源文件:
有很多的blog介绍其组成,这里不赘述,源码中有完整的解析流程:

    int64_t  iheader=MAKE64_LEFT(headers[0],headers[1],headers[2],headers[3],
            headers[4],headers[5],headers[6],0);
    //ALOGD("[%s%d]%#lx",__FUNCTION__ ,__LINE__,iheader);
    int id = GET64BIT_LEFT(iheader,12,1);
    int layer = GET64BIT_LEFT(iheader,13,2);
    int protection_absent = GET64BIT_LEFT(iheader,15,1);
    int profile = GET64BIT_LEFT(iheader,16,2);
    int sampling_frequency_index = GET64BIT_LEFT(iheader,18,4);
    int private_bt = GET64BIT_LEFT(iheader,22,1);
    int channel_configuration = GET64BIT_LEFT(iheader,23,3);
    int original_copy = GET64BIT_LEFT(iheader,26,1);
    int home = GET64BIT_LEFT(iheader,27,1);

    //adts_variable_header
    int copyright_identification_bit = GET64BIT_LEFT(iheader,28,1);
    int copyright_identification_start=GET64BIT_LEFT(iheader,29,1);
    int aac_frame_length =GET64BIT_LEFT(iheader,30,13);
    int adts_buffer_fullness=GET64BIT_LEFT(iheader,33,11);
    int number_of_raw_data_blocks_in_frame=GET64BIT_LEFT(iheader,44,2);

一直想找个官方的标准文档看看,就是没找着,大部分文章都是雷同一句话:AAC音频格式在MPEG-2(ISO-13318-7 2003)中有定义,可是没人提及这个文档哪里有,?这个标准据说是收费的,而且很贵,MPEG官网也没找着。
抄一个网络上常见的图记录下:

?

mediacode解码aac:

mediacode参数?"csd-0",如何设定?

?其中有一个参数,"csd-0", 很难找到这个参数的官方完整说明,因为这个参数和AAC格式本身无关,在ffmpeg软解中也没有找到该参数,只是MediaCode(也有可能是omx的)自己使用的一个特殊参数,全称:Codec specific data,? 可以在android源码中找到其相关信息,android 源码中:
frameworks/av/media/libstagefight/MetaDataUtils.cpp ::
里面函数:
MakeAVCCodecSpecificData()
MakeAACCodecSpecificData()

bool MakeAACCodecSpecificData(AMediaFormat *meta, unsigned profile, unsigned sampling_freq_index,
        unsigned channel_configuration) {

    if(sampling_freq_index > 11u) {
        return false;
    }

    uint8_t csd[2];
    csd[0] = ((profile + 1) << 3) | (sampling_freq_index >> 1);
    csd[1] = ((sampling_freq_index << 7) & 0x80) | (channel_configuration << 3);

    static const int32_t kSamplingFreq[] = {
        96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050,
        16000, 12000, 11025, 8000
    };
    int32_t sampleRate = kSamplingFreq[sampling_freq_index];

    AMediaFormat_setBuffer(meta, AMEDIAFORMAT_KEY_CSD_0, csd, sizeof(csd));
    AMediaFormat_setString(meta, AMEDIAFORMAT_KEY_MIME, MEDIA_MIMETYPE_AUDIO_AAC);
    AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_SAMPLE_RATE, sampleRate);
    AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_CHANNEL_COUNT, channel_configuration);

    return true;
}

所以这个参数只是 Mediacode 自定的,和aac文件自身格式无关,没什么好研究的,既然要用Mediacode,就遵循它的设定,直接套用上面函数即可(可以看到这个数据也只是包含了profie, sampleFrequency, channel 三个信息,而这三个参数明明有单独的设置接口,还要重复这么一个信息,真是对它无语)
?

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-12 16:42:49  更:2021-08-12 16:43:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 5:49:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码