当前位置:首页 > 智能硬件 > 人工智能AI
[导读] 前言如果网络是理想的,即无丢包、无抖动、低延时,那么接收到一帧完整数据就直接播放,效果一定会非常好。但是实际的网络往往很复杂,尤其是无线网络。如果还是这样直接播放,网络稍微变差,视频就会卡顿,出

前言如果网络是理想的,即无丢包、无抖动、低延时,那么接收到一帧完整数据就直接播放,效果一定会非常好。但是实际的网络往往很复杂,尤其是无线网络。如果还是这样直接播放,网络稍微变差,视频就会卡顿,出现马赛克等异常情况。所以,在接收端对接收的数据做一个缓冲是很有必要的。 缓冲一定是以延时作为代价的,延时越大,对抖动的过滤效果越好。一个优秀的视频jitterbuffer,不仅要能够对丢包、乱序、延时到达等异常情况进行处理,而且还要能够让视频平稳的播放,尽可能的避免出现明显的加速播放和缓慢播放。 主流的实时音视频框架基本都会实现jitterbuffer功能,诸如WebRTC、doubango等。WebRTC的jitterbuffer相当优秀,按照功能分类的话,可以分为jitter和buffer。buffer主要对丢包、乱序、延时到达等异常情况进行处理,还会和NACK、FEC、FIR等QOS相互配合。jitter主要根据当前帧的大小和延时评估出jitter delay,再结合decode delay、render delay以及音视频同步延时,得到render TIme,来控制平稳的渲染视频帧。 下面将分别对jitter和buffer做介绍。 Buffer

buffer运行机制图 buffer对接收到的rtp包的主要处理操作如下:

第一次接收到一个视频包,从freeframes队列中弹出一个空frame块,用来放置这个包。

之后每次接收到一个RTP包,根据时间戳在incompleteframes和decodableframes中寻找,看是否已经接收到过相同时间戳的包,如果找到,则弹出该frame块,否则,从freeframes弹出一个空frame。

根据包的序列号,找到应该插入frame的位置,并更新state。其中state有empty、incomplete、decodable和complete,empty为没有数据的状态,incomplete为至少有一个包的状态,decodable为可解码状态,complete为这一帧所有数据都已经到齐。decodable会根据decode_error_mode 有不同的规则,QOS的不同策略会设置不同的decode_error_mode ,包含kNoErrors、kSelecTIveErrors以及kWithErrors。decode_error_mode 就决定了解码线程从buffer中取出来的帧是否包含错误,即当前帧是否有丢包。

根据不同的state将frame帧push回到队列中去。其中state为incomplete时,push到incompleteframes队列,decodable和complete状态的frame,push回到decodableframes队列中。

freeframes队列有初始size,freeframes队列为空时,会增加队列size,但有最大值。也会定期从incompleteframes和decodable队列中清除一些过时的frame,push到freeframes队列。

解码线程取出frame,解码完成之后,push回freeframes队列。

 jitterbuffer与QOS策略联系紧密,比如,incompleteframes和decodable队列清除一些frame之后,需要FIR(关键帧请求),根据包序号检测到丢包之后要NACK(丢包重传)等。 Jitter所谓jitter就是一种抖动。具体如何解释呢?从源地址发送到目标地址,会发生不一样的延迟,这样的延迟变动就是jitter。 jitter会带来什么影响?jitter会让音视频的播放不平稳,如音频的颤音,视频的忽快忽慢。那么如何对抗jitter呢?增加延时。需要增加一个因为jitter而存在的delay,即jitterdelay。

更新jitterdelay图 其中,frameDelayMS指的是一帧数据因为分包和网络传输所造成的延时总和、帧间延迟。具体如下图,即RTP1和RTP2到达Receiver的时间差。

帧间延迟图 framesizeBytes指当前帧数据大小,incompleteFrame指是否为完整的帧,UpdateEsTImate为根据这三个参数来更新jitterdelay的模块,这个模块为核心模块,其中会用到卡尔曼滤波对帧间延迟进行滤波。 JitterDelay =theta[0] * (MaxFS – AvgFS) + [noiseStdDevs * sqrt(varNoise) –noiseStdDevOffset] 其中theta[0]是信道传输速率的倒数,MaxFS是自会话开始以来所收到的最大帧大小,AvgFS表示平均帧大小。noiseStdDevs表示噪声系数2.33,varNoise表示噪声方差,noiseStdDevOffset是噪声扣除常数30。UpdateEsTImate会不断地对varNoise等进行更新。 在得到jitterdelay之后,通过jitterdelay+ decodedelay +renderdelay,再确保大于音视频同步的延时,加上当前系统时间得到rendertime,这样就可以控制播放时间。控制播放,也就间接控制了buffer的大小。
 取帧,解码播放

取帧解码播放图 本文只介绍jitterbuffer相关内容,所以这里只详细介绍取帧这一步。 解码线程会一直从buffer中寻找期望的数据,这里说的期望的数据分为必须完整的和可以不完整的。如果期望的数据是完整的,那就要从decodableframes队列取出状态为complete的frame,如果期望的数据可以是不完整的,就要从decodableframes和incompleteframes队列取出数据。取数据之前,总是先去找到数据的时间戳,然后计算完jitterdelay和渲染时间,再经过一段时间的延时(这个延时为渲染时间减去当前时间、decodedelay和render delay)之后再去取得数据,传递到解码,渲染。 取完整的帧时,有一个最大等待时间,即当前buffer中没有完整的帧,那么可以等待一段时间,以期望在这段时间里,可以出现完整的帧。 后记从上述原理可以看出,WebRTC中的接收buffer并非是固定的,而是根据网络波动等因素随时变化的。jitter则是为了对抗网络波动造成的抖动,使得视频能够平稳播放。 那么,jitterbuffer是否存在可以优化的空间呢?jitterbuffer已经较为优秀,但我们可以通过调整里面的一些策略,来使视频质量更好。比如,增大缓冲区,因为jitterbuffer是动态的,直接增大freeframes的size是无效的,只能通过调整延时,来增大缓冲区。再比如,调整等待时间,以期望获得更多完整的帧。再如,配合NACK,FIR、FEC等QOS策略,来对抗丢包。 当然,这都是以牺牲延时为代价的。总之,要在延时和丢包、抖动之间做出平衡。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

线性电源(Linear power supply)是先将交流电经过变压器降低电压幅值,再经过整流电路整流后,得到脉冲直流电,后经滤波得到带有微小波纹电压的直流电压。要达到高精度的直流电压,必须经过稳压电路进行稳压。

关键字: 线性电源 稳压 波纹电压

MC33035无刷直流电机控制器采用双极性模拟工艺制造,可在任何恶劣的工业环境条件下保证高品质和高稳定性。该控制器内含可用于正确整流时序的转子位置译码器。

关键字: 直流马达 控制电路 滤波器

可编程式直流电源是一种将控制电路、功率变换电路和开关稳压电路集成于一体的新型电源,具有体积小、重量轻、效率高、功能强等特点。

关键字: 可编程电源 直流电源 功率变换

随着科技的飞速发展,电子产品在我们日常生活中扮演着越来越重要的角色。而在这些电子产品中,接口作为连接设备与外部设备的桥梁,其重要性不言而喻。其中,Type-C接口作为一种新型的接口标准,因其独特的优势,逐渐成为了众多电子...

关键字: 电子产品 Type-C 接口

往复泵是一种重要的流体输送设备,广泛应用于化工、石油、制药、冶金等领域。其工作原理基于活塞在泵缸内的往复运动,通过改变泵缸内的容积来实现液体的吸入和排出。本文将详细阐述往复泵的工作原理、结构特点、性能参数以及应用领域,以...

关键字: 往复泵 泵缸 设备

液控单向阀,作为液压系统中的一种关键控制元件,在工程机械、冶金、化工、船舶等多个领域发挥着不可替代的作用。它利用控制液体对主阀芯进行开启和关闭操作,从而实现对液流方向的精确控制。本文将详细阐述液控单向阀的工作原理,包括其...

关键字: 液控单向阀 液压系统 控制元件

场效应管(Field Effect Transistor,简称FET)是一种重要的半导体器件,广泛应用于电子设备的各种电路中。它具有输入电阻高、噪声小、功耗低、动态范围大、易于集成、没有二次击穿现象、安全工作区域宽等优点...

关键字: 场效应管 半导体器件 电子设备

电子电路作为现代电子设备的重要组成部分,其稳定性和可靠性对于设备的正常运行至关重要。然而,在实际使用过程中,电子电路难免会出现各种故障,需要进行及时的维修。本文将详细介绍电子电路的维修方法,包括故障诊断、维修步骤、维修技...

关键字: 电子电路 现代电子设备 维修

随着科技的不断发展,颜色传感器在多个领域中的应用越来越广泛。TCS230作为一款高性能的颜色传感器,因其出色的性能和稳定性受到了广泛关注。本文将详细阐述TCS230颜色传感器的工作原理,包括其结构、功能特点以及颜色检测机...

关键字: 颜色传感器 TCS230 光电二极管

程控开关,即程序控制开关,是一种根据预设程序或指令进行开关动作的装置。它广泛应用于工业自动化、智能家居、通信等领域,实现设备的远程控制、定时开关等功能。本文将详细介绍程控开关的使用方法,帮助读者更好地理解和应用这一技术。

关键字: 程控开关 工业自动化 远程控制
关闭
关闭