来源:https://blog.csdn.net/marshal_zsx/article/details/81012137
Android 多媒体系统纵向跨越了Android系统的所有4个层次: Java应用程序层、Java框架层、本地代码层、Linux驱动层。多媒体本地代码层是多媒体系统的重点。
音频相关的应用软件有: 音乐播放器,电话,声音设置,视频播放器等等。
该层代码位置frameworks/base/media/java/android/media。其中关键类的作用如下:
Audio的JNI代码在framewoks/base/core/jni目录下面,会和其他一些系统文件生成libandroid_runtime.so供上层调用。
客户端:
AudioTrack、AudioRecorder、MediaPlayer、MediaRecorder、AudioSystem对应Java层的相关类,代码放置在frameworks/av/media/libmedia中, C++语言编写,编译后成为libmedia库。
服务端:
AudioFlinger和AudioPolicyService是核心代码,它们的代码在frameworks/av/services/audioflinger,编译后成为libaudioflinger库,运行在AudioServer系统进程。
HAL是AudioFlinger向下访问的对象,厂商会在这一层实现自己的接口层,桥接硬件驱动和上层框架,形成的文件会编译成audio.primary.,audio.a2dp.等so库文件供音频模块加载。
一般情况下用的ALSA音频架构
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 直接调用
----通过用AudioTrack来播放pcm格式音乐的流程,来讲解整个音频架构处理的流程。
android p音频播放从app开始 ->在framework层创建播放器->在audio library层做音频流和输出流控制->在Hal层将音频数据写入到输出设备进行声音输出。
其中audio library层是音频处理的核心。
App --> Frameworks --> Audio Library --> HAL