MediaCodec+SurfaceView实现视频播放器,按Home再返回视频画面黑屏

一、概述

  案例:在利用MediaCodec+SurfaceView做硬解码视频播放器的时候遇到的问题。切换app,锁屏开屏、home键返回、切换页面返回视频播放画面均会出现黑屏。

    原因就在于SurfaceView在Activity执行onPause的时候会销毁,onResume的时候会重新创建。而MediaCodec无法利用原始创建的Surface,所以解码会出现异常退出。导致视频画面黑屏

二、解决办法

  我这边的解决办法是换插件。把SurfaceView换成TextureView。因为TextureView虽然在onPause的时候也会销毁,但是其可以重新设置SurfaceTexture,达到复用的目的,因此不会黑屏。

  解决代码如下:

  1.在布局文件中将SurfaceView替换为TextureView

  2.TextureView实现TextureView.SurfaceTextureListener

 override fun onSurfaceTextureAvailable(surfaceTexture: SurfaceTexture, p1: Int, p2: Int) {
        if (mSurfaceTexture != null) {//其实最主要的代码在这里:利用之前创建的SurfaceTexture,在TextureView重新可见的时候设置进去
            textureView?.setSurfaceTexture(mSurfaceTexture!!)
        }
        if (mSurfaceTexture == null) {
            mSurfaceTexture = surfaceTexture
        }
    }

    override fun onSurfaceTextureSizeChanged(p0: SurfaceTexture, p1: Int, p2: Int) {
    }

    override fun onSurfaceTextureDestroyed(surfaceTexture: SurfaceTexture): Boolean {
        //app退到后台时让解码线程暂停
        mSurfaceTexture = surfaceTexture
        return false
    }

    override fun onSurfaceTextureUpdated(p0: SurfaceTexture) {

    }

  3.SurfaceTexture和Surfac并不会自动销毁需要我们手动销毁,在onDestroy中销毁就行

/**
         * 由于此处不会自动释放,所以要手动的去释放
         */
        if(mSurfaceTexture!=null){
            mSurfaceTexture?.release()
            mSurfaceTexture=null
        }
        if(mSurface!=null){
            mSurface?.release()
            mSurface = null
        }

  

posted on 2022-08-09 09:41  飘杨......  阅读(945)  评论(0编辑  收藏  举报