SurfaceView+MediaPlayer实现简单的视频的播放

在这里插入图片描述

初始化的代码:

private void initMediaPlayer() {
        mediaPlayer = new MediaPlayer();

        try {

            //mediaPlayer.setDataSource("/sdcard/newyear.mp4");//配置播放MP4文件源。
            Uri uri = Uri.parse("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4");
            mediaPlayer.setDataSource(this, uri);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //设置一个回调函数,当mediaplayer准备好之后,会回调该函数。
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mediaPlayer.setLooping(true);
                int duration = mediaPlayer.getDuration();//获取视频的时间长度
                seekBar.setMax(duration);//设置seek的max为视频播放的长度.
                mediaPlayer.start();
                Message message = new Message();
                message.arg1 = time;
                handler.sendMessage(message);
                isPlaying = true;
            }
        });
    }

private void initView() {
        videoSurfaceView = findViewById(R.id.videoSurfaceView);
        findViewById(R.id.start).setOnClickListener(this);
        findViewById(R.id.pause).setOnClickListener(this);

        surfaceHolder = videoSurfaceView.getHolder();
        surfaceHolder.addCallback(this);

        seekBar = findViewById(R.id.seekBar);
        seekBar.setOnSeekBarChangeListener(this);
    }

需用到的参数:

private SurfaceView videoSurfaceView;
    private SurfaceHolder surfaceHolder;
    private MediaPlayer mediaPlayer;

    private SeekBar seekBar;
    private int time;

    private boolean isPlaying;//标志位,来判断当前视频是否正在播放
    private boolean isPause;
实现SurfaceHolder.Callback接口,重写方法
@Override
    public void surfaceCreated(SurfaceHolder holder) {
        initMediaPlayer();
        player.setDisplay(holder);//设置让surfaceView来播放视频
        player.prepareAsync();//异步准备
    }

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

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        if(player.isPlaying()){
            Log.e("surfaceDestroyed###","播放结束");
            player.stop();//停止
            player.release();//释放资源
        }
    }

添加暂停、开始监听事件:

@Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.start:
                if (isPause) {
                    mediaPlayer.start(); //重新播放
                    isPause = false;
                }
                break;
            case R.id.pause:
                //如果正在播放
                if (mediaPlayer.isPlaying()) {
                    mediaPlayer.pause();//暂停
                    isPause = true;
                }
                break;
                default:
                    break;
        }
    }

进度条:

 //进度条改变的进度
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

    }

    //开始拖动
    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    //停止拖动
    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
         mediaPlayer.seekTo(seekBar.getProgress());//调整mediaplayer的播放进度
        handler.removeCallbacksAndMessages(null);//删除所有handler的信息.
        Message message = new Message();
        time = (seekBar.getProgress() / 1000);
        handler.sendMessage(message);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        handler.removeCallbacksAndMessages(null);//防止内存泄漏
    }
}

Handler操作进度条的改变:

Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            seekBar.setProgress(time * 1000);
            Message message = new Message();
            time++;
            handler.sendMessageDelayed(message, 1000);
        }
    };

主类代码:

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video);

        initView();

    }

布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.bw.day05.day05"
    android:orientation="vertical"
    >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/start"
            android:text="start"
            android:layout_weight="1"
            />
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="pause"
            android:layout_weight="1"
            android:id="@+id/pause"
            />
    </LinearLayout>
    <SeekBar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/sb"
        />
    <SurfaceView
        android:layout_width="match_parent"
        android:layout_height="600dp"
        android:id="@+id/surface"
        />
</LinearLayout>

猜你喜欢

转载自blog.csdn.net/qq_44946212/article/details/91632761