怎么解决码流多slice场景下的马赛克、绿屏问题?

科技   2024-11-11 12:03   北京  

前言:

大家好,在我们平时做视频解码过程中,会经常遇到如下这些问题:花屏、绿屏、抖动、卡顿等问题,应该说这些问题,是很容易遇到的,而且有时候很难解决,同时大部分原因可能是在弱网环境下,导致传输过程中丢数据,进而在解码器拿到码流数据进行解码的时候,就会出现上述描述的问题!

而今天我要给大家分享的主题是:没有丢数据的情况,在解码器上进行解码,呈现出花屏或者绿屏的现象,如下下面图片所示:

那么,这种情况到底是什么原因导致的呢?

下面,我就来分析一下这种场景下的问题原因?

多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的解决思路也是类似的。

最后:

关于弱网环境传输导致数据丢失的优化策略这种情况,大家也可以在留言处进行交流学习。

好了,本次内容就分享到这里,感谢大家阅读!

END

来源:飞一样的成长

版权归原作者所有,如有侵权,请联系删除

推荐阅读
为什么大厂都在用Yocto?
培养一个优秀的嵌入式工程师有多难?
C/C++大限将至,美国要求2026年前全面剔除!

→点关注,不迷路←

嵌入式微处理器
关注嵌入式相关技术和资讯,你想知道的都在这里。
 最新文章