博客
关于我
ULPFEC在WebRTC中的实现
阅读量:276 次
发布时间:2019-03-01

本文共 1625 字,大约阅读时间需要 5 分钟。

ULPFEC在WebRTC中的实现

1. 前言

在基于IP网络的多媒体通信系统中,网络丢包对通信质量有严重影响。例如,视频可能出现马赛克、图像模糊或帧率下降,音频可能失真或出现噪声干扰。这显著影响用户体验。WebRTC通过丢包重传(NACK)和前向纠错(FEC)来应对网络丢包问题。本文聚焦于FEC,特别是ULPFEC(Uneven Level Protection Forward Error Correction)在WebRTC中的实现。

2. ULPFEC理论学习

ULPFEC由RFC5109定义,用于WebRTC中以RED格式封装在RTP中传输。ULPFEC通过XOR操作生成FEC数据包,并在接收端结合已接收数据包恢复丢失数据。其优势在于可根据数据包重要程度提供不同保护级别,从而高效利用带宽。

2.1 ULPFEC基本概念

ULPFEC数据包包含以下信息:

  • 序列号基准(SN base):用于标识FEC包保护的数据包序列号。
  • 偏移量掩码(mask):确定每个保护级别保护的数据包位置。
  • 保护长度(protection length):指示每个级别保护的数据包数量。

FEC包通过XOR运算生成校验码,接收端利用这些校验码恢复丢失数据。ULPFEC通过动态分配保护级别,平衡带宽利用和丢包保护能力。

2.2 ULPFEC报文格式

ULPFEC报文由头部和多个保护级别组成。头部包含:

  • E flag:扩展位,当前设置为0。
  • L flag:指示偏移掩码长度,0表示16位,1表示48位。
  • Recovery field:由RTP头部字段XOR后得到。
  • Length recovery field:由负载长度XOR后得到。

每个保护级别包含级别头部和负载。级别头部包括保护长度和偏移掩码,掩码确定数据包保护分布。

2.3 ULPFEC报文构造

FEC报文构造基于RFC3550定义的RTP头部,头部包含XOR运算后的RTP字段。FEC头部通过XOR生成,负载部分由对应数据包XOR后得到。

构造过程包括:

  • 确定FEC包数量。
  • 生成掩码表,确定数据包保护分布。
  • 生成FEC负载,填充头部信息。
  • 2.4 ULPFEC报文发送

    FEC报文以RED格式发送,包含Primary Data Block和Redundant Data Block。Primary Data Block为原始数据包,Redundant Data Block为FEC包。WebRTC采用RED封装,确保数据可靠传输。

    3. ULPFEC在WebRTC中的实现

    3.1 ULPFEC报文构建

    WebRTC中,FEC报文构建流程包括:

  • 数据包编码和后处理。
  • 检查是否启用RED和FEC。
  • 构造FEC包并解包为RED格式。
  • 发送原始数据包和FEC包。
  • 代码实现中,EncodeFec函数生成FEC包,GenerateFecPayloads填充负载,FinalizeFecHeaders修正头部。

    3.2 ULPFEC掩码表和掩码

    掩码表用于确定数据包保护分布。WebRTC支持均匀和非均匀保护:

    • 均匀保护:所有数据包等保护。
    • 非均匀保护:根据数据包重要性分配不同保护级别。

    保护模式包括:

  • kModeNoOverlay:分离重要和普通数据包保护。
  • kModeOverlay:叠加保护。
  • kModeBiasFirstPacket:均匀保护基础上强化首包保护。
  • 3.3 ULPFEC报文接收和数据包恢复

    接收过程包括:

  • 解包RED包,判断RTP或FEC包。
  • 插入数据包到合适列表。
  • 恢复丢失数据包。
  • 恢复过程包括:

  • 检查FEC包丢包数,决定恢复策略。
  • 使用XOR运算恢复丢失数据包。
  • 修复RTP头部和负载。
  • 4. 总结

    本文从理论到实现详细探讨了ULPFEC在WebRTC中的应用。通过理解其原理和代码实现,掌握了FEC在网络通信中的重要作用,为进一步研究音视频技术和模块化开发奠定了基础。

    转载地址:http://oeyx.baihongyu.com/

    你可能感兴趣的文章
    mysqli
    查看>>
    MySQLIntegrityConstraintViolationException异常处理
    查看>>
    mysqlreport分析工具详解
    查看>>
    MySQLSyntaxErrorException: Unknown error 1146和SQLSyntaxErrorException: Unknown error 1146
    查看>>
    Mysql_Postgresql中_geometry数据操作_st_astext_GeomFromEWKT函数_在java中转换geometry的16进制数据---PostgreSQL工作笔记007
    查看>>
    mysql_real_connect 参数注意
    查看>>
    mysql_secure_installation初始化数据库报Access denied
    查看>>
    MySQL_西安11月销售昨日未上架的产品_20161212
    查看>>
    Mysql——深入浅出InnoDB底层原理
    查看>>
    MySQL“被动”性能优化汇总
    查看>>
    MySQL、HBase 和 Elasticsearch:特点与区别详解
    查看>>
    MySQL、Redis高频面试题汇总
    查看>>
    MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
    查看>>
    mysql一个字段为空时使用另一个字段排序
    查看>>
    MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
    查看>>
    MYSQL一直显示正在启动
    查看>>
    MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
    查看>>
    MySQL万字总结!超详细!
    查看>>
    Mysql下载以及安装(新手入门,超详细)
    查看>>
    MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
    查看>>