Android audio框架初识

概述

Audio音频子系统 是Android Framework 的一个重要的子系统之一,也是最复杂的子系统之一,其在Android中负责音频方面的数据流传输和控制功能,也负责音频设备的管理。一个完整的Android音频系统架构如下图所示:
在这里插入图片描述

audio 框架分层

application层

应用层,调用音频服务的app或设置,如:音视频播放器、拨打电话、录音/录视频、音量设置等。

Framework层

Framework层包含java与c++,通过jni机制进行相互调用,主要分为以下三层:

Framework java

Framework java层提供APP调用的java接口,该层代码位置**【frameworks/base/media/java/android/media】**,主要包含:

  • MediaPlayer.java:提供给播放APP调用的接口,支持audio各种格式的音频文件;
  • MediaRecorder.java:提供给音频录音APP调用的接口;
  • AudioTrack.java: 提供给音频播放APP调用的接口,这个只能用来播放wav格式的音频文件;
  • AudioRecorder.java:负责录音数据的采集,属 Android 应用框架API类;
  • AudioManager.java: 提供声音控制;
  • AudioService.java: 通道选择;
  • AudioSystem: 音效设置;
    其中MediaPlayer、MediaRecorder对比AudioTrack、AudioRecorder功能类似,功能强大且易于使用,但是高度封装,不适合深入开发。

jni

Audio JNI层是音频应用框架和本地框架的桥梁,通过JNI层才能调用到C++层代码,其相当于一座桥梁使得 java函数接口与c++函数接口一一对应,其对应的目录为**【framewoks/base/core/jni 与 frameworks/base/core/jni】**

  • android_media_MediaPlayer.cpp
  • android_media_AudioRecord.cpp
  • android_media_AudioTrack.cpp
  • android_media_AudioSystem.cpp

Native Framework

Native Framework由C++语言编写,通过jni转换供Framework java层调用,其分为客户端与服务端部分,分别对应Framework java层中播放、录音接口与声音控制、设置等java接口。
客户端:【frameworks/av/media/libaudioclient】

  • AudioRecord.cpp:负责录音数据的采集,属 Android 本地框架API类
  • AudioTrack.cpp:负责回放数据的输出,属 Android 本地框架API类;
  • AudioSystem.cpp:负责音频事务的综合管理,属 Android 本地框架API类

服务端:【frameworks/av/services/audioflinger】编译后成为libaudioflinger库,运行在AudioServer系统进程

  • AudioFlinger.cpp
  • AudioHwDevice.cpp
  • AudioStreamOut.cpp

HAL层

HAL层是AudioFlinger向下访问的对象,厂商会在这一层实现自己的接口层,桥接硬件驱动和上层框架,形成的文件会编译成audio.primary.,audio.a2dp.等so库文件供音频模块加载。

  • HAL接口层:【hardware/interfaces/audio】
  • HAL实现层:【hardware/libhardware/modules/audio】

具体调用流程

在这里插入图片描述

©️2020 CSDN 皮肤主题: 黑客帝国 设计师:上身试试 返回首页