当前位置: 首页 > article >正文

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

前言:

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

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

1690a83c1125f5a9b7d381b1e5f9fd20.jpeg

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

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

多slice的数据解码处理问题?

我这里不介绍一些基础概念,这里主要是记录一下工作当中遇到的这个问题,并如何分析和解决他的。

首先我还是用码流分析工具打开刚才那个视频:

af60fdac0686154d80a5ff815186272f.png

768bdc2d13089e8e3f967223ab0a7091.pngd7305cf7d41a09d424fee509b15696c1.png86dbf630f5aa5d01e2163c1f50192c9c.png97d1e81a7ee2228c83c42945d54eb598.png

我把图片放到这里,不知道大家在看到这里有没有观察到什么不一样的地方,如果还没有观察到,我打开一个另外视频流(也就是可以正常解码的h264视频,我上面的视频也是h264视频流哈):

729ed716e2cbd979c780f46ea6b555d7.png

再和刚才第一个码流对比,是不是会发现,现在这个码流结构里面只有一个IDR slice ,而第一个码流里面有8个IDR slice。

换句白话来说,第一个码流结构中,把关键帧拆分成8个slice,而第二个码流则是一帧完整的关键帧;所以问题的关键就在这里了。我在之前的文章里面,有给大家介绍过超低延迟实现的技术原理,大家可以看这篇文章:

揭开音视频编解码超低延迟的神秘"面纱"!

然后我再来说一下上面解码播放出现绿屏的现象的原因:也就是说一般的解码器是解码一帧完整的数据,而现在一帧完整的数据被拆分成8份slice,在解码器看来,每一个slice是一帧完整的数据,所以导致一般的解码器无法正常解码。

怎么解决?

这里有一个思路,从语法中可以找到一个Access unit delimiter的nalu type:

c137144cba2c5ce1fec8c181d2626866.png

那这个nalu type是什么意思呢?意思是一帧完整的数据到下一帧完整数据的一个分解线。

所以依据这个,我们可以把上面分片的slice用一个buffer进行合并,直到遇到nalu type 为0x09的时候,就进行对这个Buffer操作,这样可以解决上面的绿屏问题!同理,h265的解决思路也是类似的。

最后:

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

好了,本次内容就分享到这里!


http://www.kler.cn/a/387112.html

相关文章:

  • 计算机的错误计算(一百五十二)
  • mapreduce 将数据清洗后保存到 hbase
  • 力扣每日一题 3258. 统计满足 K 约束的子字符串数量 I
  • el-dialog 设置 水平垂直居中 高度不固定
  • Ubuntu 20.04安装CUDA 11.0、cuDNN 8.0.5
  • 【AI技术】PaddleSpeech部署方案
  • 云原生安全解决方案NeuVector 5.X部署实践
  • 鸿蒙笔记--skills
  • NestJS 项目中如何使用 class-validator 进行数据验证
  • 从认识 VNode VDOM 到实现 mini-vue
  • 【数据结构与算法】第9课—数据结构之二叉树(链式结构)
  • es数据同步(仅供自己参考)
  • 机器学习中的分类:决策树、随机森林及其应用
  • 鸿道Intewell高实时架构:鸿道Intewell-Hyper II 构型
  • c语言宏定义的优缺点及举例说明
  • AscendC从入门到精通系列(二)基于Kernel直调开发AscendC算子
  • Vue禁止打开控制台/前端禁止打开控制台方法/禁用F12/禁用右键
  • 如何设置docker的定时关闭和启动
  • MCU的OTA升级(未完-持续更新)
  • 19. 异常处理
  • 2.4_SSRF服务端请求伪造
  • Docker lmdeploy 快速部署Qwen2.5模型openai接口
  • PHP静默活体识别API接口应用场景与集成方案
  • 常用的c++新特性-->day03
  • 持续集成(Continuous Integration, CI)和持续部署(Continuous Deployment, CD)
  • C++高级编程(8)