surfaceView 遇到的问题及思考

背景

降功耗,提清晰度(华为超分算法),流畅度(一加插帧算法)

规划

为了surfaceView能稳定能上线,采用和华为(历史就有合作)合作的方式进行,一共分为3个阶段推进。
具体如下:

  1. SurfaceView可用
  2. 保证surfaceView可用,无crash。
  3. SurfaceView 首帧优化
  4. 保证使用surfaceView的情况,首帧和textureview持平
  5. SurfaceControl 最佳实践,android 系统 >= 10.0 可用

踩坑及解决方案

1. 黑屏

1. Zorder -3

surfaceview送显(送显就是给surfaceview填充图像数据)晚了,导致surfaceView无内容绘制,导致黑屏。
排查方向切换过程中dummy surface(占位不黑屏作用)或者surface + play 绑定关系出现异常。正常情况下只要player 正常 codec工作,就会送帧数据给surfaceview。

2. surface + player 张冠李戴

架构情况导致,不通用

3. 退后台过程中屏幕黑屏

dummy surface 的是否使用了。由于surfaceView 只要gone掉,surface立马销毁,会出现黑屏情况,为了避免,这种情况,可以通过设置setSurface(null)的方式,通知播放器使用dummy surface 占位,优化体验。

2. 各种 Crash

crash主要分为2类:
第一个类,系统定制化导致(各个厂商都在优化GUI框架),经过尝试,可以得到以下基本共识:
1. 巴西和泰国市场的主流机型,除了三星(海外三星问题推动困难)外,8以上系统无明显问题。
2.国内市场,华为8系统有风险(最好不上,rom兼容据说有问题),9系统(没问题)和 10系统(退后台,问题已经修复),1加内侧无明显问题。
第二个类,业务代码导致,主要是考虑点,“异步”、“临界点”。

3. 首帧数据负向

在第一期中,主要考虑可用,实际prepare时间延后,在surfaceView# surfaceCreated 回调后触发播放逻辑,用户感知的首刷时间验证,数据负向。
在第二期中,
方案1: 通过保证在surface未回调前,先prepare player 在surfaceView# surfaceCreated回调后,在进行setSurface,在触发start(必先出现黑屏播放)。
方案2 : 通过保证在surface未回调前,先prepare player,然后将SurfaceView的控制权交給Player(setSurfaceHolder)。
第二期难点,切记别张冠李戴。

回顾

对播放底层来说,使用SurfaceView 和TextureView 二者提供的surface 无明显的差别,均是把解码的数据放到指定的指针地址。然后通过系统的SurfaceFlinger进行surface的整合和显示。
surfaceView的一切收益,都是由surfaceView的拥有独立surface 所带来的,其主要的兼容性问题也与此密切相关。
surfaceView surface不能缓存(10.0之前),surfaceView的渲染,必须在surfceView的surfaceCreated 和 surfaceDestroyed 状态之间使用。所以想使用好surface,必然要通过View的visible和gone来控制surface的生命周期。尤其注意切换页面的时候,view显示隐藏状态的处理。
想提高速度,必然要打破SurfaceView的显示状态,前置prepare player。

展望

随着各个厂商的定制化的逐渐完善,bug越来越少,surafceView的推进上来看,最适合
SurfaceControl 方案,预期会在数据体验上和textureView打平。

你可能感兴趣的:(音视频,Android,随笔)