[Android]Audio 架构 解析

来源:https://blog.csdn.net/marshal_zsx/article/details/81012137

Android 多媒体系统纵向跨越了Android系统的所有4个层次: Java应用程序层、Java框架层、本地代码层、Linux驱动层。多媒体本地代码层是多媒体系统的重点。

一 Audio 架构图

 

1.1 Application层

       音频相关的应用软件有: 音乐播放器,电话,声音设置,视频播放器等等。

1.2 Application Framework层

该层代码位置frameworks/base/media/java/android/media。其中关键类的作用如下:

  1. MediaPlayer和MediaRecorder,AudioTrack和AudioRecorder,提供声音播放和录制接口,但是MediaPlayer/MediaRecorder功能更强大,也更易于使用。
  2. AudioManager、AudioService及AudioSystem等类提供声音控制、通道选择、音效设置等功能。

1.3 Jni

       Audio的JNI代码在framewoks/base/core/jni目录下面,会和其他一些系统文件生成libandroid_runtime.so供上层调用。

1.4 Native Framework层

客户端:
       AudioTrack、AudioRecorder、MediaPlayer、MediaRecorder、AudioSystem对应Java层的相关类,代码放置在frameworks/av/media/libmedia中, C++语言编写,编译后成为libmedia库。

服务端:
       AudioFlinger和AudioPolicyService是核心代码,它们的代码在frameworks/av/services/audioflinger,编译后成为libaudioflinger库,运行在AudioServer系统进程。

2.5 HAL层

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

2.6 驱动

       一般情况下用的ALSA音频架构

2、音频各层代码结构图

这里写图片描述
Audio Application Framework:音频应用框架

AudioTrack:负责回放数据的输出,属 Android 应用框架 API 类,为APP提供管理和播放一个音频流的功能(必须是PCM流,因为不提供解码功能)。

AudioRecord:负责录音数据的采集,为APP提供录音功能,属 Android 应用框架 API 类

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

AudioManager:为APP提供音量控制和响铃模式控制功能。

AudioEffect.java:为APP提供控制音效的功能。

1、录制声音MediaRecorder和AudioRecord 区别
      <1>.MediaRecorder和AudioRecord都可以录制音频,区别是MediaRecorder录制的音频文件是经过压缩后的,需要设置编码器。并且录制的音频文件可以用系统自带的Music播放器播放。 
 
      <2>.而AudioRecord录制的是PCM格式的音频文件,需要用AudioTrack来播放,AudioTrack更接近底层。 
在用MediaRecorder进行录制音视频时,最终还是会创建AudioRecord用来与AudioFlinger进行交互。 
C++层MediaRecorder创建AudioRecord类的代码位于AudioSource类构造函数中.
 
           MediaRecorder录制的数据是 amr MP3 格式 
           AudioRecorder录制出来的是比较原始的PCM音频格式 
           PCM经过编码压缩可以为 amr MP3 AAC。
 
2、播放声音时MediaPlayer和AudioTrack的区别
播放声音可以用MediaPlayer和AudioTrack,两者都提供了java API供应用开发者使用。虽然都可以播放声音,但两者还是有很大的区别的。 
       <1>.其中最大的区别是MediaPlayer可以播放多种格式的声音文件,例如 MP3,AAC,WAV,OGG,MIDI等。MediaPlayer会在framework层创建对应的音频解码器。 
 
       <2>.而AudioTrack只能播放已 经解码的PCM流,如果是文件的话只支持wav格式的音频文件,因为wav格式的音频文件大部分都是PCM流。AudioTrack不创建解码器,所以只 能播放不需要解码的wav文件。
   当然两者之间还是有紧密的联系,MediaPlayer在framework层还是会创建AudioTrack,把解码后 的PCM数流传递给AudioTrack,AudioTrack再传递给AudioFlinger进行混音,然后才传递给硬件播放。

3. 关系

音频在java层的服务只有AudioService,他实现了IAudioService接口,AudioManager 是这个服务的客户端。

AudioService服务向 下调用AudioSystem.java,AudioSystem.java再通过JNI调用到本地层。

那AudioTrack 、AudioRecord和AudioEffect呢?他们是直接调用本地接口的,

为什么他们没有java服务层呢?这是因为一般的音频文件比如mp3、ogg等都是压缩的音频流,需要经过解码才能得到pcm数据流,解码是opencore或stagefright完成的,一般是播放器的服务,比如MediaPlayer,先解码音频文件,然后去创建AudioTrack、设置音效等,然后播放音乐。这些内容的实现一般是在本地服务层,所以AudioTrack 、AudioRecord和AudioEffect的服务层在本地层的AudioFlinger里实现就够了。

Audio Native Framework:音频本地框架

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

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

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

Audio Services:音频服务

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

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

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

 

三 android p音频处理流程

----通过用AudioTrack来播放pcm格式音乐的流程,来讲解整个音频架构处理的流程。

android p音频播放从app开始 ->在framework层创建播放器->在audio library层做音频流和输出流控制->在Hal层将音频数据写入到输出设备进行声音输出。

其中audio library层是音频处理的核心。

App --> Frameworks --> Audio Library --> HAL

你可能感兴趣的:([Android]Audio 架构 解析)