AudioTrack 构造过程
每一个音频流对应着一个 AudioTrack 类的一个实例,每个 AudioTrack 会在创建时注册到
AudioFlinger 中,由 AudioFlinger 把所有的 AudioTrack 进行混合(Mixer),然后输送到
AudioHardware 中进行播放,目前 Android 同时最多可以创建 32 个音频流,也就是说,Mixer
最多会同时处理 32 个 AudioTrack 的数据流。
在播放音乐的接口里面,还有一个 MediaPlayer ,这个是偏上层的一个类,可以播放的格式
较多,其实到最后也是创建了一个 AudioTrack 进行播放。
在游戏中,经常会出现子弹,爆炸,这类声音,这类在系统里面都是用 SoundPool 来处理
的,这个可以缓存一部分,这类声音的特点就是频繁出现,但是短暂急促,用缓存机制处理
它。
一般游戏存在两种声音,背景音以及子弹这类声音。两种声音默认一个使用 MediaPlayer ,
一个使用 SoundPool ,在游戏引擎里面就是 background mp3 和 sound ,大家可以关注
cocos2dx 和 libgdx ,都是这么设计的。
MediaPlayer 状态机
MediaPlayer 的工作流程是这样的:
1,首先创建 MediaPlaer 对象; * 2,然后调用 setDataSource()方法来设置音频文件的路径;** 3,再调用 prepare()方法使 MediaPlayer 进入到准备状态;
4,调用 start 方法就可以播放音频。
在播放的时候,需要选择一个 surface 去承载画面,这里使用 SurfaceView,
@Override
public void surfaceCreated(SurfaceHolder holder) {
mPlayer.setDisplay(mSurfaceView.getHolder()); // 将 我 们 要 程 序 视 频 的 那 个
surfaceView 的 holder
// 设 置 (set) 到 我 们 的MediaPlayer 中
}
如果要使用更上层的,就是 VideoView,这个使用起来方便,当然问题也比较多。一般而言
都不直接用这个,都是自己封装一个,像市面的 vlc-android 开源项目,以及 ijkplayer ,都
是不错的选择。
在真正的底层开发人员,主要使用的是 FFmpeg,同时配合一个 surface 进行绘制,这里面
主要牵扯到的是,如何设计一个新的编码,解析,处理它。
常见的安卓配套是 FFmpeg+SDL2.0,这个里面加入了一些格式转化,方便我们直接处理数
据。
后续我们来讲下这块内容。