Android 多媒体:SurfaceView+MediaPlayer实现视频播放器

SurfaceView

提供一个嵌入在视图层次结构中的专用的绘图表面。你可以控制这个表面的格式和大小;SurfaceView负责将这个表面放置在屏幕正确的位置上。

SurfaceHolder

持有显示表面的抽象接口。允许你控制表面大小和格式,编辑表面中的像素,并监控表面的变化。这个接口通常通过SurfaceView类获取。
如果开发人员不对SurfaceHolder进行维护,会出现最小化程序后,再打开应用的时候,视频的声音在继续播放,但是不显示画面了的情况,这就是因为当SurfaceView不被用户可见的时候,之前的SurfaceHolder已经被销毁了,再次进入的时候,界面上的SurfaceHolder已经是新的SurfaceHolder了。所以SurfaceHolder需要我们开发人员去编码维护,维护SurfaceHolder需要用到它的一个回调,SurfaceHolder.Callback(),它需要实现三个如下三个方法:

  • void surfaceDestroyed(SurfaceHolder holder):当SurfaceHolder被销毁的时候回调。
  • void surfaceCreated(SurfaceHolder holder):当SurfaceHolder被创建的时候回调。
  • void surfaceChange(SurfaceHolder holder):当SurfaceHolder的尺寸发生变化的时候被回调。

MediaPlayer播放视频步骤

  1. 调用MediaPlayer.setDataSource() 方法设置要播放的资源,可以是文件、文件路径、或者URL。
  2. 调用MediaPlayer.setDisplay(holder)设置surfaceHolder。
    既然SurfaceView是配合MediaPlayer使用的,MediaPlayer也提供了相应的方法设置SurfaceView显示图片,只需要为MediaPlayer指定SurfaceView显示图像即可void setDisplay(SurfaceHolder sh)。它需要传递一个SurfaceHolder对象,SurfaceHolder可以理解为SurfaceView装载需要显示的一帧帧图像的容器,它可以通过SurfaceHolder.getHolder()方法获得。
  3. 调用MediaPlayer.prepare()来准备。
  4. 调用MediaPlayer.start()来播放视频。

DEMO

  1. 布局文件
    
  1. 播放视频
    /**
     * 播放视频
     */
    private void palyVideo(String filePath) {
        surfaceView = findViewById(R.id.sv_video);
        //surfaceHolder可以通过surfaceview的getHolder()方法获得
        surfaceHolder = surfaceView.getHolder();
        //给surfaceHolder设置一个callback
        surfaceHolder.addCallback(new SHCallBack());
        mediaPlayer = new MediaPlayer();
        try {
            //设置要播放的资源,可以是文件、文件路径、或者URL
            mediaPlayer.setDataSource(this, Uri.parse(filePath));
            //调用MediaPlayer.prepare()来准备
            mediaPlayer.prepare();
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    //调用MediaPlayer.start()来播放视频
                    mediaPlayer.start();
                    mediaPlayer.setLooping(true);
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private class SHCallBack implements SurfaceHolder.Callback {
        /**
         * 在SurfaceHolder被创建的时候回调,
         * 在这里可以做一些初始化的操作
         *
         * @param holder
         */
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            //调用MediaPlayer.setDisplay(holder)设置surfaceHolder,surfaceHolder可以通过surfaceview的getHolder()方法获得
            mediaPlayer.setDisplay(holder);
            Log.e(TAG,"surfaceCreated");
        }

        /**
         * 当SurfaceHolder的尺寸发生变化的时候被回调
         *
         * @param holder
         * @param format
         * @param width
         * @param height
         */
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

        }

代码

https://github.com/DavidJi80/Android
MediaApp
v0.5.4

参考
https://www.cnblogs.com/yxx123/p/5720907.html
https://developer.android.google.cn/reference/android/view/SurfaceView
https://developer.android.google.cn/reference/android/view/SurfaceHolder
https://blog.csdn.net/MJM_49/article/details/77504782

你可能感兴趣的:(Android 多媒体:SurfaceView+MediaPlayer实现视频播放器)