WebRTC系列分享 | WebRTC视频QoS全局技术栈
Posted 鹅厂架构师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebRTC系列分享 | WebRTC视频QoS全局技术栈相关的知识,希望对你有一定的参考价值。
1. NACK
NACK是在接收端检测到数据丢包后,发送NACK报文到发送端;发送端根据NACK报文中的序列号,在发送缓冲区找到对应的数据包,重新发送到接收端。NACK需要发送端发送缓冲区的支持,RFC5104定义NACK数据包的格式。若在JB缓冲时间内接收端收到发送端重传的报文,就可以解决丢包问题。对应上图发送端的RTCP RTPFB。
2. FECFEC是发送端在发送报文的时候,将之前的旧包也打包到新包里面,若接收端有丢包,就用新包里面冗余的旧包恢复数据。
- FLEXFEC较ULPFEC,增加纵向OXR运算。增加网络抗丢包能力。
SVC(可适性视频编码或可分级视频编码)是传统H.264/MPEG-4 AVC编码的延伸,可提升更大的编码弹性,并具有时间可适性(Temporal Scalability)、空间可适性(Spatial Scalability)及质量可适性(SNR/Quality/Fidelity scalability)三大特性,使视频传输更能适应在异质的网络带宽。
实际上Spatial Scalability和quality scalability这种方案会增加传输码率,降低编解码器性能、提高编解码器的复杂度、在一些场景下还需要服务器支持SVC层级过滤。使得SVC的Spatial Scalability和quality scalability到目前为止还没有大规模应用。但是Temporal Scalability可以在不稳定网络视频传输上被使用。
JitterBuffer实现原理是,在收到网络上的RTP报文后,不直接进行解码,需要缓存一定个数的RTP报文,按照时间戳或者seq的顺序进行重排,消除报文的乱序和抖动问题。JitterBuffer分动态JitterBuffer和静态JitterBuffer两种模式。静态JitterBuffer缓存报文个数固定。动态JitterBuffer是根据网络环路延时的情况,动态调整缓存报文个数。
关键帧也叫做即时刷新帧,简称IDR帧。对视频来说,IDR帧的解码无需参考之前的帧,因此在丢包严重时可以通过发送关键帧请求进行画面的恢复。关键帧的请求方式分为三种:RTCP FIR反馈(Full intra frame request)、RTCP PLI 反馈(Picture Loss Indictor)或SIP Info消息,具体使用哪种可通过协商确定。
6. Pacer
GCC估计带宽,这个算法的特点是:快降慢升,网络质量差时能迅速响应衰减带宽;但是网络持续向好时,不能迅速增加对应带宽。
所以需要一种快速探测算法,探测当前网络合适的带宽,保证音视频按照最佳码率值发送数据。
9. 动态帧率调整策略
视频发送端根据Sender Side BWE或REMB等参数调整出一组比较合适的码率值,当网络条件好的时候,码率值会比较大,当网络条件比较差的时候,码率值会比较低。但是若是发送端仅调整码率,不调整帧率,当网络条件比较好的时候,仅仅提升了视频质量,没有充分利用网络条件,提升实时性。当网络条件比较差的时候,码率降的比较低,若不降低帧率,视频质量会大幅度下降。所以需要增加一种机制,根据发送端的码率值,动态调整发送端的帧率值。
由于音视频处理的系统路径不同,并且音视频媒体流是分开以RTP over UDP报文形式传输,UDP报文对网络丢包延时敏感,若不进行特殊平滑处理,会导致实际播放时音视频的渲染相对延时与采集延时有偏差,这样就容易产生音视频不同步现象。音视频同步的基本思想是,以RTCP报文的NTP时间为参考,在接收端渲染前,对音视频分别进行不同长度的适当缓冲,尽量保证音视频渲染different time = 音视频采集different time。保证音视频同步。
动态分辨率调整策略设计思想是,在网络传输质量变差、CPU占有率过高,编码器编码质量QP值过大等情况下,动态降低视频传输分辨率,缓解当前异常。反之则动态增加分辨率,提供高质量的视频传输。目前webrtc这块还处于调测阶段。
3、熟悉H.264、H.265、AV1、AAC、Opus等音视频编解码标准和FFmpeg;
(以上1、2、3精通其中之一即可)
4、精通C++和多线程编程;熟悉常用数据结构、算法,具备良好的编码习惯,优秀的编码能力。
扫码添加 “鹅厂架构师小客服” ,成功通过后可进入【鹅厂架构师圈】,与技术爱好者、技术关注者分享交流,共同进步成长,欢迎大家!↓↓↓
关于我们
出品:腾讯云音视频团队
技术分享:关注微信公众号 【鹅厂架构师】
WebRTC系列分享 第二期 | WebRTC QoS方法之Pacer实现
(type)
RtpPacketMediaType::kAudio:
kFirstPriority + RtpPacketMediaType::kRetransmission:
kFirstPriority + RtpPacketMediaType::kVideo:
RtpPacketMediaType::kForwardErrorCorrection:
kFirstPriority + RtpPacketMediaType::kPadding:
kFirstPriority +
RTC_CHECK_NOTREACHED();
RoundRobinPacketQueue::QueuedPacket:: RoundRobinPacketQueue::QueuedPacket& other)
(priority_ != other.priority_)
priority_ > other.priority_;
(is_retransmission_ != other.is_retransmission_)
other.is_retransmission_;
enqueue_order_ > other.enqueue_order_;
TimeDelta kDefaultMinPacketLimit = TimeDelta::Millis( queue_time_limit = limit;
PacingController::ProcessPackets会实时计算当前处理方式会引入的系统延时,当延时大于设定目标上限值,需要及时调整Pacer目标码率,保证Pacer模块引入延时时间可控。
编码算法码控模块配合:
Pacer模块实现不复杂,但是要想真正做好Pacer功能,仅仅靠一个Pacer模块是玩不转的,需要与视频编码器的码控模块配合:
首先探测模块配置码率给编码器,编码器一定要保证在可控周期内码率收敛到配置的码率参数值以内,否则会给Pacer模块造成的累计延时越来越大压力;
另外IP帧rate也要在合理范围内。若I帧超大,势必导致关键帧传输延时变大,影响端到端系统延时。
这些参数都要根据自己的实际应用场景进行调优。
参考:
WebRTC的拥塞控制和带宽策略
3、熟悉H.264、H.265、AV1、AAC、Opus等音视频编解码标准和FFmpeg;
(以上1、2、3精通其中之一即可)
4、精通C++和多线程编程;熟悉常用数据结构、算法,具备良好的编码习惯,优秀的编码能力。
扫码添加 “鹅厂架构师小客服” ,成功通过后可进入【鹅厂架构师圈】,与技术爱好者、技术关注者分享交流,共同进步成长,欢迎大家!↓↓↓
关于我们
出品:腾讯云音视频团队
技术分享:关注微信公众号 【鹅厂架构师】
以上是关于WebRTC系列分享 | WebRTC视频QoS全局技术栈的主要内容,如果未能解决你的问题,请参考以下文章