怎么解决码流多slice场景下的马赛克、绿屏问题?
前言:
大家好,在我们平时做视频解码过程中,会经常遇到如下这些问题:花屏、绿屏、抖动、卡顿等问题,应该说这些问题,是很容易遇到的,而且有时候很难解决,同时大部分原因可能是在弱网环境下,导致传输过程中丢数据,进而在解码器拿到码流数据进行解码的时候,就会出现上述描述的问题!
而今天我要给大家分享的主题是:没有丢数据的情况,在解码器上进行解码,呈现出花屏或者绿屏的现象,如下下面图片所示:
那这种情况到底是什么原因导致的呢?
下面我就来分析一下这种场景下的问题原因?
多slice的数据解码处理问题?
我这里不介绍一些基础概念,这里主要是记录一下工作当中遇到的这个问题,并如何分析和解决他的。
首先我还是用码流分析工具打开刚才那个视频:
我把图片放到这里,不知道大家在看到这里有没有观察到什么不一样的地方,如果还没有观察到,我打开一个另外视频流(也就是可以正常解码的h264视频,我上面的视频也是h264视频流哈):
再和刚才第一个码流对比,是不是会发现,现在这个码流结构里面只有一个IDR slice ,而第一个码流里面有8个IDR slice。
换句白话来说,第一个码流结构中,把关键帧拆分成8个slice,而第二个码流则是一帧完整的关键帧;所以问题的关键就在这里了。我在之前的文章里面,有给大家介绍过超低延迟实现的技术原理,大家可以看这篇文章:
揭开音视频编解码超低延迟的神秘"面纱"!
然后我再来说一下上面解码播放出现绿屏的现象的原因:也就是说一般的解码器是解码一帧完整的数据,而现在一帧完整的数据被拆分成8份slice,在解码器看来,每一个slice是一帧完整的数据,所以导致一般的解码器无法正常解码。
怎么解决?
这里有一个思路,从语法中可以找到一个Access unit delimiter的nalu type:
那这个nalu type是什么意思呢?意思是一帧完整的数据到下一帧完整数据的一个分解线。
所以依据这个,我们可以把上面分片的slice用一个buffer进行合并,直到遇到nalu type 为0x09的时候,就进行对这个Buffer操作,这样可以解决上面的绿屏问题!同理,h265的解决思路也是类似的。
最后:
关于弱网环境传输导致数据丢失的优化策略这种情况,大家也可以在留言处进行交流学习。
好了,本次内容就分享到这里!