美文网首页
MediaPlayer和AudioTrack播放Audio的区别

MediaPlayer和AudioTrack播放Audio的区别

作者: DevSiven | 来源:发表于2016-12-16 14:10 被阅读435次

    前言

    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的区别

          本文链接:https://www.haomeiwen.com/subject/varnmttx.html