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 }