解决H.264花屏问题(二)

905 阅读2分钟

这是我参与12月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

今天又开会讨论了一下花屏的解决方案,和之前streamer端给出的解决方法一样,

我们来回忆一下之前streamer端说了什么:

streamer端改成只 cache SPS/PPS ,不 cache 最近 I帧 ,建议SDK端在收到第一帧之前将 P帧 都丢掉,不要往解码器里送,这样可以避免掉花屏。

这次给的解决方案,是这样的:

扔掉首次连接时, SPS/PPS 和 I帧 中间的 P帧 。

为什么要扔掉 P帧 呢?

I帧 是每隔N秒发一次的, I帧 中间有无数的 P帧 ,但是我们上文提到, P帧是差别帧,表示的是这一个 P帧 跟之前的一个 P帧 的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。那如果 I帧 前面的 P帧 不完整,产生花屏问题是必然的。

但是以我浅薄的经验来看,如果直接丢掉 P帧 ,应该会产生黑屏问题,不过这不是我们此次讨论的重点,先按下不表。

上一篇文章我们对 H.264 的 I帧 、 P帧 、 B帧 有了初步了解,本次,我们来研究一下什么是 SPS/PPS。

什么是 SPS/PPS ?

SPS(Sequence Paramater Set)

  1. SPS 也称作为序列参数集,其中保存了一组编码视频序列的全局参数,作为初始化信息使用;
  2. SPS 很重要,如果丢失或错误,会导致解码失败;
  3. 一般情况 SPS和PPS 的 NALUnit 通常位于整个码流的起始位置,因此需要找到 SPS/PPS 也就意味着找到了码流的起始位置。

PPS(Picture Paramater Set)

  1. 通常情况下,PPS 类似于 SPS,两者共同保存在视频文件的文件头中。

小白:这么看来 SPS/PPS 在花屏问题里,是不是只是视频流开始部位的代称,其实并不需要找到 SPS/PPS ,只需要找到第一个 I帧 ,将其前面的 P帧 丢掉即可?或者说在找到 SPS/PPS ,没有找到 I帧 之前,不对 P帧 进行渲染,直到找到第一个 I帧 才进行渲染。

对于视频流渲染问题,对于大部分前端来说都是盲区,小白也在学习的路上。

关于如何解析到 SPS/PPS 、 I帧 问题,请等待下次分解。