Android學習二、MediaPlayer播放視頻

來源:互聯網
上載者:User

MediaPlayer主要是用來播放音訊,因此它沒有提供映像輸出介面,此時就需要藉助於SurfaceView來顯示MediaPlayer播放時候的映像輸出。

有幾點要注意的:

1、MediaPlayer管理播放的,所以狀態問題一定不能忽略的。

2、SurfaceHolder.setType(int)方法雖然被標記為deprecate的,但是最好還是對SurfaceView進行這樣設定this.surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

3、最好保證mediaPlayer.start()之後,在進行mediaPlayer.setDisplay()的設定,不過一般問題不大。

4、有時候會遇到只有聲音沒有映像的情況,那是因為surfaceview的建立優先順序並不高,因此在mediaPlayer開始之後,surfaceView還沒有建立出來,因此會出現有聲音沒映像的問題

一般有兩種實現方法:

一是在通過holder增加callback,監聽surfaceCreate事件,在監聽到之後再開始mediaPlayer的相關操作,具體可以看videoView的實現方法

二是通過按鈕來實現mediaPlayer,這樣也可以保證再使用者按到按鈕之前,surfaceView已經被建立出來了。

下面是封裝的操作播放視頻的代碼,因為需要,加了一些判斷,不過基本的封裝都有。

public class OperateMedia implements OnBufferingUpdateListener,OnCompletionListener, OnErrorListener {private int position = 0;// 儲存播放的的位置private SurfaceView surfaceView;// surfaceVie對象private Context context;// 內容物件private MediaPlayer mediaPlayer;// mediaplayer對象private int currentPlay = 0;// 儲存當前現正播放的視頻 0表示還沒有記錄private boolean justBack = false;// 是否剛才另外一個介面跳回,fasle 表示不是public OperateMedia(Context context, MediaPlayer mediaPlayer,SurfaceView surfaceView) {// TODO Auto-generated constructor stubthis.context = context;this.mediaPlayer = mediaPlayer;this.surfaceView = surfaceView;// mediaPlayer的設定this.mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);this.mediaPlayer.setOnBufferingUpdateListener(this);this.mediaPlayer.setOnCompletionListener(this);// surfaceView的設定this.surfaceView.getHolder().setKeepScreenOn(true);this.surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);this.surfaceView.getHolder().addCallback(new SurfaceCallback()); // surfaceView的回調}// 設定播放不同的視頻public void loadSrc(int num) {// 如果在次播放的是不同的視頻,那麼就將position初始化,並且reset,重新設定視頻源if (num != currentPlay) {position = 0;try {currentPlay = num;mediaPlayer.reset();AssetFileDescriptor fd = null;switch (num) {case 0:fd = context.getAssets().openFd("a.mp4");break;case 1:fd = context.getAssets().openFd("b.mp4");break;case 2:fd = context.getAssets().openFd("c.mp4");break;case 3:fd = context.getAssets().openFd("d.mp4");break;}mediaPlayer.setDataSource(fd.getFileDescriptor(),fd.getStartOffset(), fd.getLength());play();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalStateException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return;// 中斷當前程式}// 如果點擊的是同一個視頻。那麼就不用reset了if (num == currentPlay) {if (justBack) {play();return;} else {//如果不是從另一個activity切換回來,那麼,就直接設定到0,開始播放mediaPlayer.seekTo(0);mediaPlayer.start();mediaPlayer.setDisplay(surfaceView.getHolder());// 設定螢幕}}}// 播放視頻public void play() {mediaPlayer.prepareAsync();mediaPlayer.setOnPreparedListener(new OnPreparedListener() {public void onPrepared(MediaPlayer mp) {if (position > 0) {mediaPlayer.seekTo(position);if (justBack) {justBack = false;position = 0;}}mediaPlayer.start();}});mediaPlayer.setDisplay(surfaceView.getHolder());// 設定螢幕}// 視頻播放完成的回調方法public void onCompletion(MediaPlayer mp) throws IllegalStateException {if (currentPlay == 0) {MediaVideo.justPlay = false;}}//public void onBufferingUpdate(MediaPlayer mp, int percent)throws IllegalStateException {}// SurfaceView的callBackprivate class SurfaceCallback implements SurfaceHolder.Callback {public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}public void surfaceCreated(SurfaceHolder holder) {if (position > 0) {loadSrc(currentPlay);}}public void surfaceDestroyed(SurfaceHolder holder) {// 介面銷毀,即將跳轉到另外一個介面if (mediaPlayer.isPlaying()) {justBack = true;position = mediaPlayer.getCurrentPosition();mediaPlayer.stop();}}}public boolean onError(MediaPlayer mp, int what, int extra) {return false;}}

推薦一個寫的不錯的MediaPlayer的文章:點擊開啟連結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.