默认
发表评论 0
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
实时视频通话超低延迟架构的思考与实践(三)——关于信道编码技术的思考
阅读(16994) | 评论(0 收藏 淘帖
实时视频通话超低延迟架构的思考与实践(三)——关于信道编码技术的思考_图10.jpg



信道编码分几个部分。一种是根据先验知识的网络冗余编码技术——前向纠错技术。以RS(4,6)编码为例,我要发一个分组,这个分组有六个包,其中有四个包是实际媒体数据,有两个包是冗余包。那么在解码端收到六个包中任意的四个,就可以完全恢复所有携带媒体内容的包。例如这里2、3都丢了,收到了1、4、r1、r2,也能够完全恢复2和3。这样看来很好,任意两个丢掉都可以完全恢复。但是这样的算法也有它的弱点,不太适合突发性的丢包。因为这个分组不宜太大,如果分组很大,分组就有很大的延时。分组如果很小,很可能整个分组都丢掉了。实际上这种做法就没有任何意义。所以它不太适合突发性丢包,而且它毕竟是根据先验知识去做的一种冗余,也就是说它永远是根据上一时刻网络的状态作出的判断,下一时刻网络是什么样的,是预测的东西。网络是实时发生变化的,这种预测的东西并不完全可靠。所以它恢复的效率在实际网络中相对比较低,而且这样的算法复杂度相对比较高。当然它也有优势,例如我们是提前算好的,一次性发过去,不需要等到你发现丢包时我再做怎样的冗余传输,所以不受网络往返的影响。而且这种分组可以任意、随机调整大小冗余度,比较适合均匀丢包的场景。

实时视频通话超低延迟架构的思考与实践(三)——关于信道编码技术的思考_图11.jpg

另外一项技术是丢包重传技术。相对来说,丢包重传相对RS来讲,更有针对性,所以恢复效率比较高。第一个Go Back N技术是类似于TCP的传输技术,发送端在不断的发包,接收端要负责告诉发送端我现在收到包的情况是怎么样,收到的连续的帧的是序列号什么样的。发送端发现发了10个帧,接收端只正确收到8,不管9号包或者10号包是否收到,都会丢包重传。所以Go Back N技术有一定的目的性,维护的是丢包状态,它知道哪些包是没有收到的,但是并不精准。

接下来是自动选择重传技术(Selective ARQ)。选择性的重传,是在接收端发现了哪个包丢了,然后才会让发送端重新发送这个包。听起来是非常好的一个技术,效率很高,丢了哪个包就重传哪个包。但是它的弱点在于,你必须要假定这个包是频密的发送才可以。例如发送端发出1、2、3、4这样的包,但是一秒钟才发一个包,什么时候发现2丢了呢?收到3的时候。如果2作为最后一包,永远发现不了丢掉了。也就是如果发包不频密,至少需要1秒钟才发现它丢。这个时候再让它重传,就很晚了。
所以在一个真实的系统中,选择性重传是首选,因为音视频的大部分场景是频密的,但是可能也要结合一些Go-Back -N的做法。发一些确认机制,这样才能把重传做得更加完备。另外所有的重传都要至少等一个网络往还时,因为无论是确认丢包还是反馈收包情况,都需要一个网络往返时,所以它的弱点是,它受网络往返时影响比较大,如果控制不好,有可能造成重传风暴。优势是算法计算复杂比较低,且容易实现。另外,因为它有很大的针对性,无效的重传包会比较少,针对突发性的丢包会有比较好的效果。
刚才讲了针对不可靠网络的两种传输技术,前向纠错和丢包重传,它们都有各自的优点和缺点。实际上一个好的网络分发技术应该是将这两种结合在一起的,根据不同的信道情况把这两种技术结合在一起。

实时视频通话超低延迟架构的思考与实践(三)——关于信道编码技术的思考_图12.jpg

上图来自于网络,首先从左下角蓝色部分看起,当网络往返时很小,丢包率不高的时候就用重传。但是当网络RTT很高的时候,在这个图里面去看,就没有选用重传策略。从我个人的角度来看,我认为这并不是一个非常合理的做法。因为刚才提到了,FEC是一个无目的性的、根据先验知识去做的一种冗余技术,虽然当RTT很高,重传很耗时,但如果没有重传,要加很多冗余包,才能把丢掉的包完全恢复,实际就会带来很大的资源浪费。而且当你丢包率很高的时候,可能还并不能够完全恢复所有包。视频只要丢帧就会很卡,视频丢包率应该控制在千分之几以下,才可以达到顺畅的可以观看的水平。

实时视频通话超低延迟架构的思考与实践(三)——关于信道编码技术的思考_图13.jpg

关于信道编码的思考。信道编码和网络吞吐呈反比关系。无论是重传性编码还是冗余性编码,都会占用带宽,从而减低实际媒体信息的吞吐量。现实的生活中,信道都有限制。当你传输的时候,就要根据信道的特征去做一些策略。信道如果有拥塞,我们就需要有一个拥塞控制的算法,去估计应该把整个信道怎么样做合理分配。

另外,在做一个系统的时候,想清楚如何去评价一个系统的效果是很重要的一个点。在信道编码的时候,一个很重要的指标是,信道编码的有效性是什么样子的。有效性分为两种,一种是重传或者冗余能否真的把丢掉的包补回来,这是一个有效性。即使这个包补回来了,但是如果经过一个信道编码策略之后,还有一些丢包。例如原来的丢包是20%,补回来变成1%,那么这个重传在我们的评价当中实际上是没有效果的,因为1%的丢包对音频来讲是无所谓的,但是对视频来讲是很卡的。在这样的评价系统中,补回来还有1%的丢包,那么所有的编码都是没有太大意义的。举这个例子,如果在这时信道也发生拥塞,再进行这样的信道编码,就不会达到很好的效果。这个时候是否应该停止所有的信道编码呢?

还有信道编码有效性的判断,衡量它是否好,就是加了多少冗余,冗余中有多少没有被利用好,如果这些冗余像刚才那个例子那样,6包带2包的冗余,刚好丢掉2包,整个包都恢复出来了都使用到了,那就是百分之百的冗余都有效。如果4包信息丢了1包,却带了2包荣誉,其中1包就没有效果。所以想要做一个好的系统,应该先想到如何评价这个系统的好坏。


即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

推荐方案
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部