MediaPlayer和AudioTrack播放Audio的区别与联系

前言

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();

你可能感兴趣的:(MediaPlayer和AudioTrack播放Audio的区别与联系)