WebRTC QoS方法(汇总篇)

本文介绍了WebRTC中用于提升服务质量(QoS)的关键技术,包括NACK、FEC、SVC等丢包恢复机制,以及Jitter Buffer、IDR Request、PACER等网络适应策略,并探讨了动态帧率调整、分辨率调整和音视频同步等高级特性。
部署运行你感兴趣的模型镜像

目前总结出WebRTC用于提升QoS的方法有:

NACK、FEC、SVC、JitterBuffer、IDR Request、PACER、Sender Side BWE、VFR(动态帧率调整策略)、AVSync(音视频同步)、动态分辨率调整。

这几种方法在WebRTC架构分布如下:

具体实现原理如下:

一、NACK

与NACK对应的是ACK,ACK是到达通知技术。以TCP为例,他可靠因为接收方在收到数据后会给发送方返回一个“已收到数据”的消息(ACK),告诉发送方“我已经收到了”,确保消息的可靠。NACK也是一种通知技术,只是触发通知的条件刚好的ACK相反,在未收到消息时,通知发送方“我未收到消息”,即通知未达。

NACK是在接收端检测到数据丢包后,发送NACK报文到发送端;发送端根据NACK报文中的序列号,在发送缓冲区找到对应的数据包,重新发送到接收端。NACK需要发送端发送缓冲区的支持,RFC5104定义NACK数据包的格式。若在JB缓冲时间内接收端收到发送端重传的报文,就可以解决丢包问题。对应上图发送端的RTCP RTPFB

具体请参考webrtc QOS方法一(NACK实现)_CrystalShaw的博客-优快云博客_nack pli

二、FEC

FEC是发送端在发送报文的时候,将之前的旧包也打包到新包里面,若接收端有丢包,就用新包里面冗余的旧包恢复数据。

webrtc实现该冗余功能,有三种方式:

1、RED就是RFC2198冗余。将前面的报文直接打入到新包里面,在接收端解析主包和冗余包。

2、ULPFEC,目前webrtc仅将SVC编码的Level 0视频帧打包成FEC。其余层有丢包,就逐步降低帧率,保证视频相对流畅。用到的协议是:RFC5109。

3、FLEXFEC较ULPFEC,增加纵向OXR运算。增加网络抗丢包能力。

目前大家都比较优选FlexFEC冗余编码,比较少使用UlpFEC冗余编码。具体参考webrtc QOS方法二.3(flexfec rfc8627简介)_CrystalShaw的博客-优快云博客

具体请参考webrtc QOS方法二.1(FEC原理)_CrystalShaw的博客-优快云博客

三、SVC

webrtc的VPX用到的是时间可适性(Temporal Scalability)算法。通过改变一个GOP内帧的线性参考关系。防止网络丢包对视频传输造成的影响。

具体请参考:webrtc QOS方法三(SVC实现)_CrystalShaw的博客-优快云博客

webrtc使用NACK+FEC+SVC作为QOS的解决方案。参考链接:Handling packet loss in WebRTC | IEEE Conference Publication | IEEE Xplore

四、JitterBuffer

JitterBuffer实现原理是,在收到网络上的RTP报文后,不直接进行解码,需要缓存一定个数的RTP报文,按照时间戳或者seq的顺序进行重排,消除报文的乱序和抖动问题。JitterBuffer分动态JitterBuffer和静态JitterBuffer两种模式。静态JitterBuffer缓存报文个数固定。动态JitterBuffer是根据网络环路延时的情况,动态调整缓存报文个数。

具体请参考webrtc QOS方法八(JitterBuffer)_CrystalShaw的博客-优快云博客_webrtc 渲染时间

五、IDR Request

关键帧也叫做即时刷新帧,简称IDR帧。对视频来说,IDR帧的解码无需参考之前的帧,因此在丢包严重时可以通过发送关键帧请求进行画面的恢复。关键帧的请求方式分为三种:RTCP FIR反馈(Full intra frame request)、RTCP PLI 反馈(Picture Loss Indictor)或SIP Info消息,具体使用哪种可通过协商确定。

六、PACER

PACER,是网络报文平滑策略。一个视频帧有可能分别封装在几个RTP报文,若这个视频帧的RTP报文一起发送到网络上,必然会导致网络瞬间拥塞。以25fps为例,若这帧视频的RTP报文,能够在40ms之内发送给接收端,接收端既可以正常工作,也缓冲了网络拥塞的压力。PACER就是实现把RTP同一时刻生产的若干包,周期性的发送,防止上行流量激增导致拥塞。

具体请参考webrtc QOS方法十(pacer实现)_CrystalShaw的博客-优快云博客_pacer延时介绍

七、Sender Side BWE或REMB(Receiver Estimated Maximum Bitrate)

这个算法的思路是根据接收端的丢包率或延时情况维护一个状态机。以根据丢包率为例,在判断为overuse时,就根据一定的系数减少当前发送端的码率值,当判断为underuse时又根据增加系数来增加发送端的码率值;然后将这个值通过rtcp包发送给发送端,发送端根据该值来动态的调整码率。

具体请参考webrtc QOS方法四(Sender Side BWE)_CrystalShaw的博客-优快云博客_bwe介绍

                                                        

                                                          

八、动态帧率调整策略

视频发送端根据Sender Side BWE或REMB等参数调整出一组比较合适的码率值,当网络条件好的时候,码率值会比较大,当网络条件比较差的时候,码率值会比较低。但是若是发送端仅调整码率,不调整帧率,当网络条件比较好的时候,仅仅提升了视频质量,没有充分利用网络条件,提升实时性。当网络条件比较差的时候,码率降的比较低,若不降低帧率,视频质量会大幅度下降。所以需要增加一种机制,根据发送端的码率值,动态调整发送端的帧率值。

具体请参考webrtc QOS方法五.1(帧率调整)_CrystalShaw的博客-优快云博客

九、AVSync音视频同步

由于音视频处理的系统路径不同,并且音视频媒体流是分开以RTP over UDP报文形式传输,UDP报文对网络丢包延时敏感,若不进行特殊平滑处理,会导致实际播放时音视频的渲染相对延时与采集延时有偏差,这样就容易产生音视频不同步现象。音视频同步的基本思想是,以RTCP报文的NTP时间为参考,在接收端渲染前,对音视频分别进行不同长度的适当缓冲,尽量保证音视频渲染different time = 音视频采集different time。保证音视频同步。

具体请参考:webrtc QOS方法十一(音视频同步AVSyn实现)_CrystalShaw的博客-优快云博客_webrtc 音视频同步

十、动态分辨率调整策略

动态分辨率调整策略设计思想是,在网络传输质量变差、CPU占有率过高,编码器编码质量QP值过大等情况下,动态降低视频传输分辨率,缓解当前异常。反之则动态增加分辨率,提供高质量的视频传输。目前webrtc这块还处于调测阶段。实现核心函数是:

TestVideoCapturer::OnFrame
->VideoAdapter::AdaptFrameResolution

附录一份最近重新整理的链接。

WebRTC系列分享 | WebRTC视频QoS全局技术栈系列解析WebRTC用于提升QoS的方法icon-default.png?t=N7T8https://mp.weixin.qq.com/s/NQco5wg-j5t1-fW63G06Uw

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think>好的,我现在要处理用户关于调整帧率到两万赫兹的问题。首先需要明确用户所说的“帧率”具体指什么。因为在信号处理和音频处理中,“帧率”可能有不同的含义。用户之前的问题是关于thinkdsp库中的SawtoothChirp类参数调整,所以可能他们现在是在处理音频生成或信号处理时的采样率设置。 首先,用户可能混淆了“帧率”和“采样率”这两个术语。在音频处理中,采样率(Sample Rate)指的是每秒采集或播放的样本数,单位是赫兹(Hz)。而帧率(Frame Rate)通常指视频中每秒显示的帧数,比如30fps或60fps。但在某些音频处理库或应用中,可能会用“帧”来指代一组音频样本,这时候帧率可能指每秒处理的帧数,每帧包含多个样本。 接下来,用户提到调整到两万赫兹,即20kHz。但根据奈奎斯特定理,采样率需要至少是信号最高频率的两倍。如果用户是想处理高达20kHz的音频信号,那么采样率至少需要40kHz。不过,实际中常用的采样率是44.1kHz(CD标准)或48kHz。如果用户设置采样率为20kHz,那最高只能准确还原10kHz的信号,这可能不符合他们的需求。因此,需要确认用户的实际需求是什么。 用户之前使用的thinkdsp库中,生成波形时会默认使用44100Hz的采样率。如果用户想调整这个采样率,应该在创建Wave对象时指定framerate参数。例如,使用make_wave方法时设置framerate=20000。但需要提醒用户这样设置可能导致高频信号失真,特别是如果他们的信号中包含超过10kHz的成分的话。 另外,需要检查用户是否真的需要调整采样率到20kHz。如果是处理特定设备或应用的需求,比如某些硬件仅支持20kHz采样率,那么调整是必要的。否则,建议保持标准采样率以确保音频质量。同时,用户可能对如何修改代码中的采样率参数存在疑问,需要指导他们在生成波形时正确设置framerate参数,并说明可能的影响。 最后,考虑到用户可能是刚开始接触信号处理,需要以简单明了的方式解释采样率的概念、奈奎斯特定理,以及调整采样率带来的影响。同时提供具体的代码示例,如修改make_wave方法的参数,并建议注意事项,如高频信号的丢失和文件大小的变化。这样用户能够理解调整后的效果,并正确应用在项目中。</think>调整信号处理的采样率(即用户所指的"帧率")至 **20,000 Hz**(20 kHz)时,需要注意以下关键点及实现方法: --- ### 一、核心概念澄清 1. **术语说明**: - **采样率 (Sample Rate)**:每秒采集或生成的音频样本数(单位Hz),决定信号能表示的最高频率(根据奈奎斯特定理,最高频率为采样率的1/2) - **帧率 (Frame Rate)**:通常指视频每秒显示的帧数(如30fps),但在音频处理中可能误用为采样率 2. **20 kHz采样率的特点**: - 能准确表示最高 **10 kHz** 的音频信号(满足$f_{\text{max}} < \frac{f_s}{2}$) - 适用于电话语音(300-3400Hz)、低频音效等场景 - 文件体积比44.1kHz标准减少约55% --- ### 二、在`thinkdsp`中的调整方法 ```python from thinkdsp import SawtoothChirp, Wave # 创建锯齿波扫频信号(参数示例) chirp = SawtoothChirp(start=100, end=5000, duration=1, amp=0.8) # 生成波形时指定采样率 wave = chirp.make_wave(duration=1, framerate=20000) # ✅ 关键参数设置 # 验证采样率 print(wave.framerate) # 输出应为20000 ``` --- ### 三、参数调整的影响分析 | 参数 | 标准值 | 20kHz设置 | 影响 | |------|--------|-----------|------| | `framerate` | 44100 | 20000 | 高频成分丢失(>10kHz)| | 文件大小 | 约882KB/s | 约400KB/s | 存储空间减少 | | CPU负载 | 高 | 低 | 处理速度提升 | --- ### 四、典型应用场景 1. **嵌入式设备音频**:树莓派等资源受限设备的音效生成 2. **语音处理**:电话语音质量模拟(带宽限制) 3. **低频振动分析**:机械故障检测等低于10kHz的振动信号 --- ### 五、注意事项 1. **高频信号丢失**: ```python # 若原始信号含12kHz成分,20kHz采样时会出现混叠 wave_aliased = SawtoothChirp(start=8000, end=12000).make_wave(framerate=20000) ``` ![采样率对比示意图](https://via.placeholder.com/600x200?text=20kHz采样导致12kHz信号混叠) 2. **音质变化**:使用前建议对比试听 ```python wave_hi = chirp.make_wave(framerate=44100) # 高采样率版本 wave_lo = chirp.make_wave(framerate=20000) # 低采样率版本 wave_hi.play() # 先听高质量版本 wave_lo.play() # 再听降采样版本 ``` 3. **参数传递规范**: ```python # 正确方式:通过make_wave()传递 wave = chirp.make_wave(duration=2, framerate=20000) # 错误方式:直接修改类属性 ❌ chirp.framerate = 20000 # 不会生效 ``` --- 如果需要处理高频信号(>10kHz),建议保持44100Hz或48000Hz标准采样率。20kHz设置更适合对高频成分无要求的低频场景。
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值