qmediaplayer获取流类型_Android MediaPlayer类详解
Android的多媒體框架支持各種常見的多媒體類型,這樣在程序中可以很容易地集成音頻、視頻或者圖片。Android下對于音頻或者視頻的支持均需要使用到MediaPlayer類
MediaPlayer處于Android多媒體包下"android.media.MediaPlayer",僅有一個無參的構造函數,雖然Android平臺僅為我們提供了一個無參的構造函數,但是為了方便我們初始化,還為我們提供了幾個靜態的create()方法用于完成MediaPlayer初始化的工作。(常用的兩個)
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使用注意事項
在使用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();
}
});
使用完MediaPlayer需要回收資源。MediaPlayer是很消耗系統資源的,所以在使用完MediaPlayer,不要等待系統自動回收,最好是主動回收資源。
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
對于單曲循環之類的操作,除了可以使用setLooping()方法進行設置之外,還可以為MediaPlayer注冊回調函數,MediaPlayer.setOnCompletionListener(),它會在MediaPlayer播放完畢被回調。
// 設置循環播放
// mediaPlayer.setLooping(true);
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// 在播放完畢被回調
play();
}
});
因為MediaPlayer一直操作的是一個流媒體,所以無可避免的可能一段流媒體資源,前半段可以正常播放,而中間一段因為解析或者源文件錯誤等問題,造成中間一段無法播放問題,需要我們處理這個錯誤,否則會影響Ux(用戶體驗)。可以為MediaPlayer注冊回調函數setOnErrorListener()來設置出錯之后的解決辦法,一般重新播放或者播放下一個流媒體即可。
自己用Kotlin寫的一個音樂播放器(仿QQ音樂),算是MediaPlayer使用的一個小例子吧
https://github.com/neugaojin/SEMusic
總結
以上是生活随笔為你收集整理的qmediaplayer获取流类型_Android MediaPlayer类详解的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 微信运动更新有延迟吗
- 下一篇: 冰箱制冰要多久(冰箱推荐排名)
