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 } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2013-08-09 Android百度地图2.0运行定位到当前位置时“服务没有启动”