前言
MediaPlayer和AudioTrack都可以应用在android系统中音频的播放,两者都提供API给开发者自定义播放音频文件,功能相似,但是两者还是区别很大。首先MediaPlayer是活跃在framework层并提供的音频解码器,支持多种文件格式(例如:MP3、WAV、AAC等等主流音频文件)。而AudioTrack则只支持PCM流(将话音、图像等模拟信号每隔一定时间进行取样,使其离散化),因为目前比较多的WAV音频文件大部分是一件解码的PCM流,所以AudioTrack目前直接支持WAV音频文件
为什么说仅支持?这里要说到MediaPlayer和AudioTrack之间的联系,MediaPlayer在framework层也实例化了AudioTrack,其实质是MediaPlayer在framework层进行解码后,生成PCM流,然后代理委托给AudioTrack,最后AudioTrack传递给AudioFlinger进行混音,然后才传递给硬件播放。
比较常见使用AudioTrack,CPU占用率低,内存消耗也比较少。因此如果是播放比较短时间的WAV音频文件,还是比较建议使用AudioTrack。如果扩展性比较高,当然就是推荐MediaPlayer。
下面举例MediaPlayer和AudioTrack一些使用例子:
MediaPlayer
MediaPlayer mMediaPlayer = new MediaPlayer(); // 创建MediaPlayer实例
mMediaPlayer.setDataSource(dataSource); // 设置播放资源,可以是asset、sd卡路径,也可以是网络url
mMediaPlayer.setLooping(false); // 不循环播放
mMediaPlayer.prepare(); // 播放前准备,需要调用,create创建实例可以不用调用
mMediaPlayer.start(); // 进行播放
mMediaPlayer.stop(); // 停止播放
mMediaPlayer.pause(); // 暂停播放
mMediaPlayer.release(); // 释放播放资源
mMediaPlayer.reset(); // 重置播放器状态
mMediaPlayer.seekTo(); // 调整进度
AudioTrack
// 初始化
AudioTrack mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, // 指定在流的类型
// STREAM_ALARM:警告声
// STREAM_MUSCI:音乐声,例如music等
// STREAM_RING:铃声
// STREAM_SYSTEM:系统声音
// STREAM_VOCIE_CALL:电话声音
samplerate,// 设置音频数据的采样率
AudioFormat.CHANNEL_CONFIGURATION_STEREO,// 设置输出声道为双声道立体声
AudioFormat.ENCODING_PCM_16BIT,// 设置音频数据块是8位还是16位
mAudioMinBufSize, AudioTrack.MODE_STREAM);// 设置模式类型,在这里设置为流类型
// AudioTrack中有MODE_STATIC和MODE_STREAM两种分类。
// STREAM方式表示由用户通过write方式把数据一次一次得写到audiotrack中。
// 这种方式的缺点就是JAVA层和Native层不断地交换数据,效率损失较大。
// 而STATIC方式表示是一开始创建的时候,就把音频数据放到一个固定的buffer,然后直接传给audiotrack,
// 后续就不用一次次得write了。AudioTrack会自己播放这个buffer中的数据。
// 这种方法对于铃声等体积较小的文件比较合适。
mAudioTrack.play(); // 启动
mAudioTrack.write();//数据写入audiotrack中
// 停止与释放资源
mAudioTrack.stop();
mAudioTrack.release();
网友评论