Android MediaPlayer架构图解

Android MediaPlayer架构图解_第1张图片


http://blog.csdn.net/itachi85/article/details/7215409


在android原生的媒体播放器中是由mediaplayerservice来控制媒体播放器的,在mediaplayerservice中创建了mediaplayer,在mediaplayer.java的native方法通过jni调用android_media_mediaplayer.cpp中的方法,接着往下调用mediaplayer.cpp中的方法,mediaplayer通过ipc机制调用mediaplayerService中的方法,mediaplayerService通过对文件格式的判断来选择不同的播放器来播放音乐,当是midi格式时会选择sonivox来播放,当系统的配置文件中允许ogg格式由vorbris来播放时则用vorbris,否则用stagefright来播放。其余的格式由配置文件选择是否由stagefright来播放,是则由stagefright播放,不是则由opencore的pvplayer来播放。
          stagefright由awesongplayer来控制,他会调用setDatasource()方法来加载音频文件,根据音频文件的头字段不同来选择不同的解析器,这个解析器会进行av分离分离出audioTrack和videoTrack,接着会根据audioTrack的mineType类型来选择不同的编码器来进行编码,这个是由audioSource来进行解码,audioSource是对omxCodec的封装,而audioPlayer则是用来控制audioSource和audioTrack的。audioplayer调用fillBuffer()方法将解完码的数据写进data中最终将解完码的数据流最后会传给AudioTrack,由audioTrack来交给audioFlinger,audioTrack通过调用creataudioTrack()来得到audioFlinger返回的iaudioTrack,将数据流写进iaudioTrack的共享buffer中,然后audioFlinger读出缓存中的数据交给playbackTread进行混音或者直接输出给缓存并最终将数据给audioOutputStream。


混音AudioMixer: AudioMixer 是不是就是把 多路AudioTrack 进行  “与” 操作!


小红(说话) ----嘴1-------声波1

                                                       ——  声波叠加—— 人耳

小明(说话)----嘴2--------声波2


Music(播放)----------AudioTrack1

                                                         ——AudioMixer.process(混音)----------音频驱动-------->扬声器---------人耳

FMRadio(播放)------AudioTrack2


关于编解码:

 

原始PCM ------aac算法编码-------压缩的PCM数据-------添加mp3数据格式信息-------mp3文件                         AudioFlinger

原始RGB-------H.264算法编码------压缩RGB数据-----添加mp4/3gp/avi数据格式信息------mp4/3gp/avi文件       SurfaceFlinger


MediaPlayer mp = new MediaPlayer();
mp.setDataSource(PATH_TO_FILE);
mp.prepare();
mp.start();

简单说来,播放流程如下:
Java端发起调用,MediaPlayer会转至MediaPlayerService,然后会调用相应的解码工具解码后创建AudioTrack,所有待输出的AudioTrack在AudioFlinger::AudioMixer里合成,然后通过AudioHAL(AudioHardwareInterface的实际实现者)传至实际的硬件来实现播放


Android MediaPlayer架构图解_第2张图片

你可能感兴趣的:(Android MediaPlayer架构图解)