用r

阅读: 评论:0

用r

用r

本文描述了用rs码在rtp传输中实现fec的方法

 

概念:

媒体包: 荷载为视音频数据的包。

Fec包: 荷载为校验数据的包。(没有丢包的情况下可以忽略)。

1,纠错算法采用reed_solomon(RS)纠错算法,用开源的jerasure库实现。

2,rtp媒体包长度规定为1408 bytes(包括rtp固定头和扩展头和数据),因为RS算法对 数据块有整除方面的要求,这个值是RS算法内部计算所得,这个值也可以是960  1024, 1088 ,1152 ,1216,1344,1408,1472 ......。(64的倍数=w*sizeof(long))(w=8)

3,所有rtp包都增加扩展头,扩展头大小为4 bytes,扩展头的前2个字节里面记录了实际数据的长度。后2个字节为0, 因为RS算法编码的时候要求数据块大小都是一致的,必要的是会填充0。

4,10个媒体包生成2个Fec包。

5 ,Fec包的大小是1408+12+4+4,比媒体包要大20个字节,因为fec包荷载的数据是 对媒体包整包的校验。

6,Fec包的payload type为127,这样对于不识别的包一般会丢掉,不影响其他播放器 播放流。Fec包rtp头的时间戳是最后一个保护包的时间戳,Fec包的rtp头的包序号 递增,其他rtp头域和被保护的包相同,Fec包的荷载包括Fec头和Fec数据组成。Fec 头为4个字节,前2个字节 为 SN基数,表示保护的rtp包的最小序列号。后1 个字节为mask,表示保护了多少个一般为10 再后面一个字节表示本组的第几个fec包,

7,图示

媒体包格式:

 

  RTP固定头12pytes

扩展头4bytes

媒体数据(1408-12-4)

 

Fec包格式:

 

  RTP固定头12pytes

扩展头4bytes

FEC头4bytes

FEC校验数据,长度等于媒体包总长度(1408)。

 

8,发包方法:

发包的时候本地要有10个包的缓存不要释放,根据这个10个包计算2个校验包后再释放内存。如果媒体包小于1408则填充0,后再计算校验值,但是发送的时候不用发送后面填充的0,把10个包发送完毕后接着发送这个2个校验包。

9,接收方法:

收rtp包的时候保持10个包的缓存不要释放,等收到Fec包的时候,根据rtp头的序号判断这10个包是否连续,如果不连续,则根据后面到来的fec包试图恢复缺失的包。如果收到的媒体包都是连续的,则丢弃fec包。

说明:

该方案可以保证没有校验功能的播放器也可以播放rtp流。

该方案参考了

基于Budge和Mackenzie于1997年提交的一个早期FEC草案

本文发布于:2024-02-02 09:57:46,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170683906543041.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23