如何解决 iPhone 6 或 iPhone 6s 上从后台切换到前台播放视频会显示为 1 到 2 秒的绿屏
iPhone 6 搭载的是 A8 芯片,iPhone 6s 搭载的是 A9 芯片。
该问题是由于切换到后台后,解码器会话会失效,当再次进入前台时,需要再次创建会话,但由于使用的视频通道没有变,继续播放接收到的很大可能是 P 帧,iOS P 帧的解码分为以下两种情况:
- A9 及以下芯片的解码器新的会话会解码无完整 GOP 的 P 帧,并将无法渲染的画面用绿色填充,即视频解码渲染开发中常说的绿屏。
- 而 A9 以上的芯片则算法是直接不解码无完整 GOP 的 P 帧,因此没这个问题。
解决
因此需要分为两步处理来解决此问题:
- 切换到前台后需要重新创建会话。
- 接受到 I帧后才进行I、P、B 帧的解码。
复现绿屏
那么如何验证无完整 GOP 的 P 帧,会渲染为绿色呢?
可以在 iPhone 6s 及以下和 iPhone 6s 以上的机型进行不解码 I 帧的测试,即可复现绿屏。
- 在 iPhone 13 上 P/B 帧调用 [self decode] 返回的都是空,因此播放视图显示为默认的黑色。
- 在 iPhone 6 或 iPhone 6s 上 P/B 帧渲染为绿色,直到下次获取 I 帧后才正常。应该是 iPhone 6 的 A8 芯片和 iPhone 6s 的 A9 芯片硬解码算法在解码 P 帧的时候没有对无 I 帧进行优化,而是直接解码,因此不完整的 GOP 将被渲染为绿色。
如何解决 iPhone 6 或 iPhone 6s 上从后台切换到前台播放视频会显示为 1 到 2 秒的绿屏