使用SurfaceView和MediaPlayer播放視頻

使用MediaPlayer播放視頻的步驟:

1.創建MediaPlayer對象,並讓MediaPlayer加載指定的視頻文件;

2.在界面佈局文件定義Surfaceview組件或者在程序中創建Surfaceview組件,併爲Surfaceview的SurfaceHolder添加Callback監聽器;

3.調用MediaPlayer對象的setDisplay(SurfaceHolder sh)將所有播放的視頻圖像輸出到指定的Surfaceview組件;

4.調用MediaPlayer對象的start()、stop()、pause()方法控制視頻的播放;


Demo:

Layout比較簡單不貼了,一個surfaceview 三個Button。

package com.example.evalee.surfaceviewplayvideo;

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;

import java.io.IOException;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    SurfaceView surfaceView;
    Button play,pause,stop;
    MediaPlayer mediaPlayer;
    int position;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        surfaceView = (SurfaceView)findViewById(R.id.surfaceview);
        play = (Button)findViewById(R.id.play);
        pause = (Button)findViewById(R.id.pause);
        stop = (Button)findViewById(R.id.stop);

        play.setOnClickListener(this);
        pause.setOnClickListener(this);
        stop.setOnClickListener(this);

        mediaPlayer = new MediaPlayer();
        surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        surfaceView.getHolder().setKeepScreenOn(true);
        surfaceView.getHolder().addCallback(new SurfaceListener());

    }

    @Override
    public void onClick(View v) {
        try{
            switch(v.getId()){

                case R.id.play:
                    play();
                    break;
                case R.id.pause:
                    if(mediaPlayer.isPlaying()){
                        mediaPlayer.pause();
                    } else {
                        mediaPlayer.start();
                    }

                    break;
                case R.id.stop:
                    if(mediaPlayer.isPlaying()){
                        mediaPlayer.stop();
                    }
                    break;
            }

        }catch (Exception e){
            e.printStackTrace();
        }

    }

    public void play() throws IOException{
        mediaPlayer.reset();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mediaPlayer.setDataSource(Environment.getExternalStorageDirectory()+"/DCIM/Camera/VID_20170410_142616.3gp");
        mediaPlayer.setDisplay(surfaceView.getHolder());
        mediaPlayer.prepare();
        mediaPlayer.start();

    }

    @Override
    protected void onPause() {
        if(mediaPlayer.isPlaying()){
            position = mediaPlayer.getCurrentPosition();
            mediaPlayer.stop();
        }
        super.onPause();
    }

    @Override
    protected void onDestroy() {
        if(mediaPlayer.isPlaying()){
            mediaPlayer.stop();
            mediaPlayer.release();
        }
        super.onDestroy();
    }

    private class SurfaceListener implements SurfaceHolder.Callback{

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            if(position > 0){
                try{
                    play();
                    mediaPlayer.seekTo(position);
                    position = 0;
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {

        }
    }
}


AndroidManifest.xml 添加讀寫SD卡權限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>




效果圖:






發佈了73 篇原創文章 · 獲贊 35 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章