Android Audio系统介绍

liguan51 贡献于2012-08-02

作者 Administrator  创建于2011-10-16 07:03:00   修改者allen  修改于2011-10-16 14:39:00字数3589

文档摘要:在framework中c/c++层的音频系统服务主要有三个。在base/media/mediaserver/Main_mediaserver.cpp的代码中可以找到。一个是AudioFlinger, MediaPlayerService, 和AudioPolicyService。AudioFlinger和AudioPolicyService是android audio系统的服务,负责音频方面的数据流传输和控制功能,也负责音频设备的管理。这个部分作为Android的Audio系统的输入/输出层次,一般负责播放PCM声音输出和从外部获取PCM声音,以及管理声音设备和设置。
关键词:

Android 音频系统整理 在framework中c/c++层的音频系统服务主要有三个。在base/media/mediaserver/Main_mediaserver.cpp的代码中可以找到。一个是AudioFlinger, MediaPlayerService, 和AudioPolicyService。AudioFlinger和AudioPolicyService是android audio系统的服务,负责音频方面的数据流传输和控制功能,也负责音频设备的管理。这个部分作为Android的Audio系统的输入/输出层次,一般负责播放PCM声音输出和从外部获取PCM声音,以及管理声音设备和设置。Mediaplayerservice 是Android中很重要也最为复杂的媒体播放器(MediaPlayer)部分的服务。MediaPlayer在底层是基于OpenCore(PacketVideo)和stagefright的库实现的。音频服务端和客户端之间的交互包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制。 代码框架: 1:Java部分代码(frameworks/base/media/java/android/media) AmrInputStream.java 继承InputStream,native调用 AsyncPlayeer.java 异步音乐播放对象将要播放的媒体文件封装成内部类Command AudioFormat.java 用于访问一些音频格式和通道配置常量,这些常量应用在AndioTrack和AudioRrcord中。 AudioManager.java 用于设置音乐模式和音量大小调整 AudioRecord.java 读取麦克风的音频流,生产PCM文件,native调用 AudioService.java 音频设置服务,在systemservice中启动,为所有的音频相关的设置提供服务,在audioservice中定义了一个audiosystemthread类,用来监控音频控制相关的信号,当有请求时会通过调用audiosystem的接口实现音频的控制,消息处理是异步的。 AudioSystem.java 提供音频系统的基本类型定义,以及基本操作的接口,native调用 AudioTrack.java 播放音频流PCM文件,native调用 CamcorderProfile.java 检索预定义的摄录像机的配置文件,native调用 CameraProfile.java 检索照片质量级别low,medinum,high 。native调用,动态加载 DecoderCapabilities.java 检索音视频解码类型,native调用 EncoderCapabilities.java 检索音视频编码能力参数,native调用 ExifInterface.java 读写JPEG格式图片的一些附加信息,native调用 FaceDetector.java 检测图片中的人脸 IAudioFocusDispatcher.aidl 为Audioservice提供接口 IAudioService.aidl 为Audioservice提供接口 IMediaScannerListener.aidl 为MediaScanner提供接口 IMediaScannerService.aidl 为MediaScanner提供接口 Jetplayer.java 控制jet engine,使用MIDI格式,native调用 MediaFile.java MediaScanner帮助类 MediaMetadataRetriever.java 为Media检索提供接口,native调用 MediaPlayer.java 音视频文件播放类,不支持多个音频同时播放,native调用 MediaRecord.java 录制音视频类,native调用 MediaScanner.java Mediascannerserver的帮助类,native调用 MediaScannerClient.java 接口 MediaScannerConnection.java 连接Mediascannerserver类 Ringtone.java RingtoneManager.java 提供了音频系统的基本类型定义,以及基本操作的接口。 铃声等 SoundPool.java 提供为引用播放音频声音的接口,在加载文件等方面做了优化,native调用,可同时播放多个音,低延迟 ToneGenerator.java 提供了播放DTMF tones的支持,如电话的拨号音,对应于直接为PCM数据提供支持,native调用 Metadate.java 媒体文件元数据类 MiniThumbFile.java 媒体缓存文件 ResampleInputStream.java 重新取样输入流,native调用 ThumbnailUtils.java 缩略图工具类 2:Audio的JNI层 JNI的cpp分布在两个部分,base/core/jni中有AudioRecord,AudioSystem,AudioTrack,JetPlayer,ToneGenarator,其他的在base/media/jni中。 3:Audio的c/c++层 1)Audio框架见下图: Audio本地框架是media库的一部分,本部分内容被编译成库libmedia.so,主要实现AudioSystem、AudioTrack和AudioRecorder三个类,对上面提供接口,由下层的本地代码去实现。AudioFlinger内容被编译成库libaudioflinger.so,它是Audio系统的本地服务部分,它是audio系统中真正做事的类,它通过硬件抽象层提供到硬件的接口。 media库中的Audio框架部分 Android的Audio系统的核心框提供了IAudioFlinger类接口,在这个类中,可以获得IAudioTrack和IAudioRecorder两个接口,分别用于声音的播放和录制。AudioTrack和AudioRecorder分别通过调用IAudioTrack和IAudioRecorder来实现。 Audio系统的头文件在frameworks/base/include/media/目录中,主要的头文件如下: AudioSystem.h:media库的Audio部分对上层的总管接口; IAudioFlinger.h:需要下层实现的总管接口; AudioTrack.h:放音部分对上接口; IAudioTrack.h:放音部分需要下层实现的接口; AudioRecorder.h:录音部分对上接口; IAudioRecorder.h:录音部分需要下层实现的接口。 IAudioFlinger.h、IAudioTrack.h和IAudioRecorder.h这三个接口通过下层的继承来实现(即 AudioFlinger)。AudioFlinger.h、AudioTrack.h和AudioRecorder.h是对上层提供的接口,它们既供本地程序调用(例如声音的播放器、录制器等),也可以通过JNI向Java层提供接口。类图如下: 2)MediaPlayer框架见下图: MediaPlayer的各个库之间的结构,在各个库中,libmedia.so位于核心的位置,它对上层的提供的接口主要是MediaPlayer类,类libmedia_jni.so通过调用 MediaPlayer类提供对JAVA的接口,并且实现了android.media.MediaPlayer类。libmediaplayerservice.so是Media的服务器,它通过继承libmedia.so的类实现服务器的功能,而 libmedia.so中的另外一部分内容则通过进程间通讯和libmediaplayerservice.so进行通讯。 libmediaplayerservice.so的真正功能通过调用OpenCore Player来完成。 整个mediaPlayer库的调用关系如下图所示: 整个MediaPlayer在运行的时候,可以分成Client和Server两个部分,它们分别在两个进程中运行,它们之间使用Binder机制实现IPC通讯。从框架结构上来看,IMediaPlayerService.h、IMediaPlayerClient.h和MediaPlayer.h三个类定义了MeidaPlayer的接口和架构,MediaPlayerService.cpp和mediaplayer.cpp两个文件用于MeidaPlayer架构的实现,MeidaPlayer的具体功能在PVPlayer(库libopencoreplayer.so)中的实现。

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档