一、Android整体框架

android audio 流程机制 android audio框架_Android

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

android audio 流程机制 android audio框架_android_02

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

android audio 流程机制 android audio框架_音视频_03

 

android audio 流程机制 android audio框架_android_04

 

Android Audio

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

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 直接调用

三、源码剖析

android audio 流程机制 android audio框架_音视频_05

 

Medio/java:           多媒体上层APP
        /jni:              java上层和native之间的桥梁
        /libdrm:       应用层代码库(提供给上层应用层,底层驱动接口)
        /libmedia:     
        /libmediaplayerservice:     
/Libstagefright:    
/mediaserver:      
/tests:

Android .mk文件详解

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

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

       Android.mk是Android架构下的一种经过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的认知

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

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

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

android audio 流程机制 android audio框架_Android_06

 

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)

android audio 流程机制 android audio框架_Android_07

 

  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—策略控制中心
  1. AudioTrack:主要负责播放音频模块
  2. AudioRecord:主要负责录音模块

AudioTrack模块分析

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

       Java层AudioTrack位于:framework\base\media\java\android\media\AudioTrack.java

              Java层更多的是直接调用AudioTrack

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

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

AudioTrack先和AudioFlinger进行交互,

android audio 流程机制 android audio框架_android_08

 

android audio 流程机制 android audio框架_android audio 流程机制_09

3 分析Java层AudioTrack 到C++层AudioTrack

3.1 构造器分析之 Java层AudioTrack 到C++层AudioTrack

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

android audio 流程机制 android audio框架_android_10