使用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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章