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中销毁就行

1
2
3
4
5
6
7
8
9
10
11
/**
         * 由于此处不会自动释放,所以要手动的去释放
         */
        if(mSurfaceTexture!=null){
            mSurfaceTexture?.release()
            mSurfaceTexture=null
        }
        if(mSurface!=null){
            mSurface?.release()
            mSurface = null
        }

  

posted on   飘杨......  阅读(1255)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
历史上的今天:
2013-08-09 Android百度地图2.0运行定位到当前位置时“服务没有启动”
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示