MediaPlayer

Android MediaPlayer類詳解

 

Android的多媒體框架支持各類常見的多媒體類型,這樣在程序中能夠很容易地集成音頻、視頻或者圖片。Android下對於音頻或者視頻的支持均須要使用到MediaPlayerhtml

MediaPlayer處於Android多媒體包下"android.media.MediaPlayer",僅有一個無參的構造函數,雖然Android平臺僅爲咱們提供了一個無參的構造函數,可是爲了方便咱們初始化,還爲咱們提供了幾個靜態的create()方法用於完成MediaPlayer初始化的工做。(經常使用的兩個)android

  • static MediaPlayer create(Context context,int resid):經過給定的Id來建立一個MediaPlayer實例。
  • static MediaPlayer create(Context context,Uri uri):經過給定的Uri來建立一個MediaPlayer實例。
    還有一些重載的create方法,請自行查看API

MediaPlayer具體方法介紹:數組

  • void setDataSource(String path) 經過一個具體的路徑來設置MediaPlayer的數據源,path能夠是本地的一個路徑,也能夠是一個網絡路徑
  • void setDataSource(Context context, Uri uri) 經過給定的Uri來設置MediaPlayer的數據源,這裏的Uri能夠是網絡路徑或是一個ContentProvider的Uri。
  • void setDataSource(MediaDataSource dataSource) 經過提供的MediaDataSource來設置數據源
  • void setDataSource(FileDescriptor fd) 經過文件描述符FileDescriptor來設置數據源
  • int getCurrentPosition() 獲取當前播放的位置
  • int getAudioSessionId() 返回音頻的session ID
  • int getDuration() 獲得文件的時間
  • TrackInfo[] getTrackInfo() 返回一個track信息的數組
  • boolean isLooping () 是否循環播放
  • boolean isPlaying() 是否正在播放
  • void pause () 暫停
  • void start () 開始
  • void stop () 中止
  • void prepare() 同步的方式裝載流媒體文件。
  • void prepareAsync() 異步的方式裝載流媒體文件。
  • void reset() 重置MediaPlayer至未初始化狀態。
  • void release () 回收流媒體資源。
  • void seekTo(int msec) 指定播放的位置(以毫秒爲單位的時間)
  • void setAudioStreamType(int streamtype) 指定流媒體類型
  • void setLooping(boolean looping) 設置是否單曲循環
  • void setNextMediaPlayer(MediaPlayer next) 當 當前這個MediaPlayer播放完畢後,MediaPlayer next開始播放
  • void setWakeMode(Context context, int mode):設置CPU喚醒的狀態。
  • **setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener) 網絡流媒體的緩衝變化時回調 **
  • setOnCompletionListener(MediaPlayer.OnCompletionListener listener) 網絡流媒體播放結束時回調
  • **setOnErrorListener(MediaPlayer.OnErrorListener listener) 發生錯誤時回調 **
  • setOnPreparedListener(MediaPlayer.OnPreparedListener listener):當裝載流媒體完畢的時候回調。

在使用MediaPlayer播放一段流媒體的時候,須要使用prepare()或prepareAsync()方法把流媒體裝載進MediaPlayer,才能夠調用start()方法播放流媒體。
 setAudioStreamType()方法用於指定播放流媒體的類型,它傳遞的是一個int類型的數據,均以常量定義在AudioManager類中, 通常咱們播放音頻文件,設置爲AudioManager.STREAM_MUSIC便可。
網絡

MediaPlayer使用注意事項

  1. 在使用start()播放流媒體以前,須要裝載流媒體資源。這裏最好使用prepareAsync()用異步的方式裝載流媒體資源。由於流媒體資源的裝載是會消耗系統資源的,在一些硬件不理想的設備上,若是使用prepare()同步的方式裝載資源,可能會形成UI界面的卡頓,這是很是影響用於體驗的。由於推薦使用異步裝載的方式,爲了不尚未裝載完成就調用start()而報錯的問題,須要綁定MediaPlayer.setOnPreparedListener()事件,它將在異步裝載完成以後回調。異步裝載還有一個好處就是避免裝載超時引起ANR((Application Not Responding)錯誤。
mediaPlayer = new MediaPlayer();
                mediaPlayer.setDataSource(path);
                mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                
                // 經過異步的方式裝載媒體資源
                mediaPlayer.prepareAsync();
                mediaPlayer.setOnPreparedListener(new OnPreparedListener() {                    
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        // 裝載完畢回調
                        mediaPlayer.start();
                    }
                });
  1. 使用完MediaPlayer須要回收資源。MediaPlayer是很消耗系統資源的,因此在使用完MediaPlayer,不要等待系統自動回收,最好是主動回收資源。
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
            mediaPlayer.stop();
            mediaPlayer.release();
            mediaPlayer = null;
        }
  1. 對於單曲循環之類的操做,除了能夠使用setLooping()方法進行設置以外,還能夠爲MediaPlayer註冊回調函數,MediaPlayer.setOnCompletionListener(),它會在MediaPlayer播放完畢被回調。
// 設置循環播放
//                mediaPlayer.setLooping(true);
                mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        // 在播放完畢被回調
                        play();                        
                    }
                });
  1. 由於MediaPlayer一直操做的是一個流媒體,因此無可避免的可能一段流媒體資源,前半段能夠正常播放,而中間一段由於解析或者源文件錯誤等問題,形成中間一段沒法播放問題,須要咱們處理這個錯誤,不然會影響Ux(用戶體驗)。能夠爲MediaPlayer註冊回調函數setOnErrorListener()來設置出錯以後的解決辦法,通常從新播放或者播放下一個流媒體便可。
相關文章
相關標籤/搜索