audio学习总结碎片细化

一、Android整体框架

二、从开机到创建媒体服务器框架图

首先启动loader引导程序,进入Linux系统内核,启动第一个进程init,根据进程配置文件init.rc启动Android文件系统和必要的守护进程。

 

 

Android Audio

AudioAndroid中最重要的一个组成部分,负责音频数据的采集和输出、音频流的控制、音频设备的管理、音量调节等内容

Audio Application Framework:音频应用框架

AudioTrack:负责回放数据的输出,属 Android 应用框架 API

AudioRecord:负责录音数据的采集,属 Android 应用框架 API

AudioSystem 负责音频事务的综合管理,属 Android 应用框架 API

Audio Native Framework:音频本地框架

AudioTrack:负责回放数据的输出,属 Android 本地框架 API

AudioRecord:负责录音数据的采集,属 Android 本地框架 API

AudioSystem 负责音频事务的综合管理,属 Android 本地框架 API

Audio Services:音频服务

AudioPolicyService:音频策略的制定者,负责音频设备的策略抉择、音量调节策略等

AudioFlinger:音频策略的执行者,负责输入输出流设备的管理及音频流数据的传输

Audio HAL:音频硬件抽象层,负责与音频硬件设备的交互,由 AudioFlinger 直接调用

三、源码剖析

 

Medio/java:           多媒体上层APP

        /jni:              java上层和native之间的桥梁

        /libdrm:       应用层代码库(提供给上层应用层,底层驱动接口)

        /libmedia:    

        /libmediaplayerservice:    

/Libstagefright:   

/mediaserver:     

/tests:  

Android .mk文件详解

       学习Android.mk文件前先学习Makefile

     Makefile文件控制整个工程的编译规则,用于描述编译文件的具体细节(源文件、依赖文件、生成文件、文件路径等)。Make就是一个命令工具,可以解析Makefile文件中的指令的一个命令工具。

       Android.mkAndroid架构下的一种经过Android系统自己处理过的一类特殊的Makefile文件。Android编译系统位于Android根目录下的bulid文件内,由许多的文件(包括Makefile*.md)组成。

Android系统架构

Android系统基于Linux内核,共分四层!

       Applications层:与用户直接交互的众多应用程序构成,基于Java开发

       Framework层:Java框架层,是Java程序能在Android 上运行的基础

       Libraries层:这一层提供动态库、Android运行时库、Daivik虚拟机等,大部分内容基于C/C++,也叫Native(本地)层

       Linux内核层:包含Linux内核和一些驱动模块

事实上在Framework层和Native层之间还有一个桥梁JNI层,作为Java与系统底层无关的基石

Android-----JNI的认知

JNIJava Native Interface):他提供了若干API接口用于实现Java和其他语言的通行,就像不同语言之间的桥梁。(Java语言和Native语言之间的API)中文可翻译为Java本地调用。

Java作为上层应用,Native作为底层的架构,JNI层介于两层之间。

Java承担着快速调用,统筹各模块功能的作用,Native承担着具体实现各模块功能的作用。

 

JNI函数注册:
              静态注册就是直接在Java文件里写个native方法 然后再c/c++文件中实现这个方法就行了!

动态注册利用 RegisterNatives 方法来注册 java 方法与 JNI 函数的一一对应关系

静态改动态注册,只需要改JNI层代码。

JNI实例:MediaScanner

       Java层调用JIN层实现native函数,JNI层实现具体和native函数的对接

多媒体框架

  1. 四层体系架构:应用层、系统层、Android运行时、Linux内核
  2. Android多媒体引擎层位于第三层主要是C/C++库支撑各种服务
  3. 首先启动loader引导程序,进入Linux系统内核,启动第一个进程init,根据进程配置文件init.rc启动Android文件系统和必要的守护进程,以及重要服务(Media Server、ServerManger)

 

  1. Zygote是第一个Java进程,是所有的Java进程的父进程
  2. APP播放一个音频文件的简单实现步骤

MediaPlayer mediaPlayer = new MediaPlayer();

//创建一个对象mediaPlayer,申请空间

mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

    @Override

    public void onCompletion(MediaPlayer mp){

    mediaPlayer.release();

    mediaPlayer = null;

    }//释放初始化为空

});

mediaPlayer.setDataSource("abc.mp3"); //获取MP3文件来源路径

mediaPlayer.setDisplay();//调用显示

mediaPlayer.prepare();//播放准备资源

mediaPlayer.start();//播放开始指令

  1. Binder机制:Android多线程之间的系统通信底层都是依赖于binder IPC来实现
  2. Binder概念梳理:

首先会有一个BOSS级别的ImediaPlayerService,他要处理的事情有点多:

  1. ImediaMetadataRetriever
  2. ImediaRecorder
  3. IOMX
  4. ImediaCodecList

所以这个BOSS会创建很多进程来跟进负责每一板块的任务!

  1. Audio系统分析

Audio主要分为3大块:

  1. AudioManager:管理全局Audio系统
    1. AudioFlinger—工作引擎,实操中心
    2. AudioPolicyService—策略控制中心
  2. AudioTrack:主要负责播放音频模块
  3. AudioRecord:主要负责录音模块

AudioTrack模块分析

AudioTrack:输出音频编码数据流,用于给缓冲区提供数据流,会被AudioFlinger调用play函数实现播放。

       JavaAudioTrack位于:framework\base\media\java\android\media\AudioTrack.java

              Java层更多的是直接调用AudioTrack

根据AudioTrack类创建对象,通过AudioManager管理模式和属性等,最后通过这个对象调用play()函数实现音频的播放,调用stop()函数实现音频播放的停止,调用rekease()函数释放对象以及所附带占有的资源。

播放的时候涉及到两种数据传输模式:MODE_STATICMODE_STREAM,在创建对象时候,传入模式参数,前者是将数据一次性地直接传递给AudioTrack,后者是创建一个缓冲池,将数据流先交给缓冲池,AudioTrack会自行从缓冲池获取数据流。

AudioTrack先和AudioFlinger进行交互,

 

3 分析JavaAudioTrack C++AudioTrack

3.1 构造器分析之 JavaAudioTrack C++AudioTrack

同时这里JavaAudioTrack对象的创建顺带Native层的AudioTrack对象也会完成创建。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值