MediaPlayer+SurfaceView实现视频播放器

我这个人走得很慢,但是我从不后退。

之前给大家分享过使用MediaController类实现视频播放器,今天呢给大家分享可以自定义的视频播放器,那就是使用MediaPlayer+SurfaceView来实现。废话不多说,直接上代码。

1. 设计思路

使用 MediaPlayer+SurfaceView实现视频播放器的流程如图所示,在学习音视频播放器的时候,一个老师画的图,在此直接借用。
在这里插入图片描述

2. 设计布局

<?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=".MainActivity"
    android:orientation="vertical"
    >
    <SurfaceView
        android:id="@+id/surfaceView"
        android:layout_weight="10"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="horizontal"
        >
        <Button
            android:id="@+id/but_play"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Play"

            />
        <!-- 暂停按钮-->
        <Button
            android:id="@+id/but_pause"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="暂停"

            />
        <Button
            android:id="@+id/but_stop"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="停止"
            />
    </LinearLayout>
</LinearLayout>

3. 实现逻辑

加入了一些事件监听器,可以选择性更改。

package com.xiaozeng.videoplayerdemo3;
。。。
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback{
    
    
    private Button play,pause,stop;
    private boolean onPlay = true;
    private MediaPlayer mediaPlayer;
    private SurfaceHolder surfaceHolder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏显示

        SurfaceView surfaceView = findViewById(R.id.surfaceView);
        surfaceView.getHolder().addCallback(this);

        surfaceHolder = surfaceView.getHolder(); //主要是将Surfaceview与mediaplayer关联起来
        mediaPlayer = new MediaPlayer();

        // mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置多媒体类型

        //设置完成事件监听器
       /* mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                Toast.makeText(MainActivity.this,"视频播放完毕",
                        Toast.LENGTH_SHORT).show();

            }
        });*/

        ///控制视频的播放、暂停、停止

        play = findViewById(R.id.but_play);
        pause = findViewById(R.id.but_pause);
        stop = findViewById(R.id.but_stop);
        play.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                if(onPlay){
    
    
                    play();
                    onPlay=false;//表示视频处于播放状态
                }else {
    
    
                    mediaPlayer.start();
                }

            }
        });

        pause.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                if(mediaPlayer.isPlaying()){
    
    
                    mediaPlayer.pause();

                }

            }
        });

        stop.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                if(mediaPlayer.isPlaying()){
    
    
                    mediaPlayer.stop();
                    onPlay = true;
                }
            }
        });
    }

    //播放方法
    public void play(){
    
    
        mediaPlayer.reset();//重置mediaplayer对象
        mediaPlayer.setDisplay(surfaceHolder);//把视频画面
        try {
    
    
            mediaPlayer.setDataSource(Environment.getExternalStorageDirectory() + "/out.mp4");
            mediaPlayer.prepare();
        }catch (Exception e){
    
    
            e.printStackTrace();
        }
        mediaPlayer.start();


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

        }

    }

    @Override
    public void surfaceCreated(@NonNull SurfaceHolder holder) {
    
    
        //启动绘图的线程。
       mediaPlayer.setDisplay(surfaceHolder);
       play(); //起播播放
    }

    @Override
    public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {
    
    
        //surface尺寸发生改变的时候调用,如横竖屏切换。

    }

    @Override
    public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
    
    
        /*mediaPlayer.release();
        mediaPlayer=null;*/
    }
}

4. 权限获取

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

5. Demo展示

请添加图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42182599/article/details/124976426