- 博客(41)
- 收藏
- 关注
原创 流媒体学习之路(WebRTC)——音频NackTracker优化思路(8)
音频NackTracker的逻辑与视频NackRequest有相似的地方,但是相比多了播放时间以及丢包的等待估计,因此限制更多。在同样的模拟环境下,原NackTracker的逻辑丢包明显。这与音频的特点有关,音频可以合理的丢弃数据并不会明显的影响听感,但是视频少一个数据就无法组成完整的图像。因此WebRTC为了保证实时性,增加了播放时间对比以及丢包参考,如果想要保证Nack的效果与视频一致,那么也需要调整一下它的频率和最大限制。
2024-06-12 14:42:26
1599
原创 流媒体学习之路(WebRTC)——GCC中ProbeBitrateEstimator和AcknowledgedBitrateEstimator的大作用(7)
ProbeBitrateEstimator和AcknowledgedBitrateEstimator两个类是gcc做码率控制的基础,webrtc对AcknowledgedBitrateEstimator的修改较少,但是对Probe相关的类一直在做调整。上面展示的m77代码和我最近看的m105代码差距就已经发生明显的变化。在Pacer中,m105增加了线程控制而且产生padding包的逻辑也做了调整。同时在触发探测的逻辑上也进行多处修改。
2024-05-10 18:03:24
1499
1
原创 流媒体学习之路(WebRTC)——FEC逻辑分析(6)
前面为大家介绍了GCC的部分逻辑,GCC作为码率控制的第一环所有的数据都会收到它输出的参考码率的限制。在发送的数据内容中有很多的分类:视频数据、音频数据、重传数据、FEC数据。FEC前面有向大家介绍过,中文称为:前向纠错。在WebRTC中有一个很好的Fec应用例子,它通过RR回复的网络信息进行动态调整,使得在传输中抵抗不同程度的网络损伤。下面我针对FEC给大家介绍一下动态变化的逻辑。FecController是WebRTC提供的接口,如果需要自定义自己的控制类,那么继承它之后进行开发就可以了。
2024-03-13 16:53:16
1810
原创 流媒体学习之路(WebRTC)——Pacer与GCC(5)
Pacer(Packet Pacing)的作用是在传输数据时能平滑的发送出去,减少对网络冲击和抖动的产生,提高通信质量。在一次数据传输中,如果所有包几乎同时发送,网络就可能会遭遇到冲击,这就可能导致网络拥塞,数据包丢失等问题。为了避免这样的问题,需要通过一个定时器均匀分散发送数据包。特别是在音视频传输中,PACER更是非常重要的一部分。因为音视频的传输对于网络的稳定性和实时性要求非常高,任何形式的网络抖动或者丢包都会造成音视频的卡顿,延迟等问题。
2024-01-02 16:18:30
2033
原创 流媒体学习之路(WebRTC)——GCC分析(4)
WebRTC 的 InterArrival 类是用于计算包之间的到达时间差(Inter-Arrival Time)的类。如果观察WebRTC的提交记录你会发现,这个类随着卡尔曼滤波器、趋势线等等算法的变更也一直在调整。那么为什么要存在这个接收间隔的计算类呢?细心的小伙伴在观察我们发送视频数据的时候会发现,数据的发送是一股一股的——常常是一次发送几个包。
2024-01-02 10:16:34
1810
原创 流媒体学习之路(机器学习应用)——了解我们的网络模型与CC算法
它提供的高度灵活性、适应性和计算能力扩展了在包括网络运营和管理在内的多个领域中使用的传统方法。在本文中,我们探索了基于RL的CC算法的性能,并提出了当前基于RL的CC算法存在的问题。例如:当某些包从一个高延迟的路由转向一个低延迟的路由时,假设其他路由的延迟不变就会产生乱序的情况(但大概率在p2p的模式下发生比较明显)。这类情况也是随机而又聚簇的形式,假设这类路由出现明显的乱序也会出现和无线丢包类似的情况(这个在现代的流媒体传输中尤为重要,因为流媒体传输要保证绝对的时序性)。
2023-09-21 15:45:17
718
原创 流媒体弱网优化之路(BBR应用)——GCC与BBR的算法思想分析
GCC竞争分析:GCC在弱网产生的瞬间,按它自身的敏感特性立刻下调到了**最低的状态**,随后**动态阈值生效**,进入上涨的周期,直到与BBR平衡后可以基本维持竞争能力。BBR竞争分析 :BBR在弱网产生的瞬间,利用congestion_windows 和 bytes_in_flight判定了网络拥塞,限制了发送。随后由于网络竞争方GCC下调码率,飞行数据大量降低,于是立刻恢复了带宽利用。随后在于GCC的竞争中逐渐趋于平衡。
2023-08-28 14:16:28
1694
原创 流媒体弱网优化之路(BBR算法应用)——QUIC-BBR算法代码分析
本文简单介绍了quiche中,BBR-V1的实现主流程,还有很多细节没有详细介绍。在quic的BBR算法中,思想主要集中在对整个传输链路承载能力的检测,重点是采样检测而非GCC逻辑中的预估。这两种思想的不同也造就了BBR算法相比GCC算法更主动,在带宽抢占中更有野性。同时,BBR中比较关键的点是保证采样的可靠性,因此使用什么类型的滤波、回归算法也是BBR可靠性很重要的一部分。后续我们将会对这些算法进行更深入的了解。
2023-08-16 09:41:11
1198
原创 流媒体弱网优化之路(WebRTC)——GCC带宽估计算法调优
经过上述的调整,我们下行的屏幕分享流可以很快的进行平衡收敛,随后在发生拥塞的过程中立刻打乱后又重新进行收敛。目的就是实现绝对的码率平均——当然这样的做法只能说是暂时的缓解了问,大家一起讨论看看有没有更多的方式去调整GCC算法呢?
2023-07-14 16:16:15
3210
2
原创 流媒体弱网优化之路(WebRTC)——断点调试GCC
本文简单演示了断点整个GCC统计的流程——比较水。大家如果有兴趣的话可以在github下载我的demo代码,一点点去断点调试,后续会加入更多的带宽估计算法,并且会做更多有趣的实验。欢迎大家使用!
2023-06-25 19:59:34
684
原创 流媒体弱网优化之路(WebRTC)——jitterbuffer分析与优化
流媒体弱网优化之路(WebRTC)——jitterbuffer分析与优化我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标:可以让大家熟悉各类Qos能力、带宽估计能力,提供每个环节关键参数调节接口并实现一个json全配置,提供全面的可视化算法观察能力。欢迎大家使用!文章目录流媒体弱网优化之路(WebRTC)——jitterbuffer分析与优化一、jitterbuffer原理二、jitterbuffer的实现三、framebuf
2023-06-15 21:18:45
6377
原创 流媒体学习之路(WebRTC)——GCC分析(3)
该模块会通过ack情况计算出对端接收数据的情况,通过经验值调整作为当前吞吐量的估计值用于计算下一次发送的码率。该模块计算出来的吞吐量会作用到码率计算模块,是一个非常重要的模块。根据每一次feedback的数据量作为采样点,通过贝叶斯估计获得一个平滑的估计值。贝叶斯估计补充:贝叶斯估计是统计学范畴里常用的参数估计方法,是基于先验采样。在经典的频率统计中,参数是固定的,样本统计量是随机变量。而在贝叶斯统计中,认为参数也是随机变量,服从某一概率分布的随机变量,贝叶斯统计的重点是研究参数的分布。
2023-02-13 14:11:58
1181
1
原创 流媒体学习之路——Google的新拥塞算法SQP详解
2022年7月25日,Google在arXiv平台上发布了一篇名为:SQP: Congestion Control for Low-Latency Interactive Video Streaming 的文章(这篇文章上下充斥着与Copa较量的意味,可能GCC被Copa比下去了很不爽,赶紧找了个场子)。文章内容详细介绍了他们为了应对低延迟场景设计的新拥塞控制算法,并给出了一些测试对比的效果,今天我们详细地看看这篇文章。
2022-10-26 14:18:56
2983
1
原创 流媒体弱网优化之路(mediasoup)——上行引入RED编码
在mediasoup上行中引入了RED编码来抵抗音频丢包造成的质量下降,将RED解码部分放置于Consumer中,实现尾端解码。
2022-10-08 19:31:52
1517
4
原创 流媒体弱网优化之路(mediasoup)——H264-SVC介绍和使用
使用mediasoup最新加入的h264源码,并在该基础上进行新的优化。
2022-10-08 19:29:12
3136
原创 流媒体弱网优化之路(FEC+mediasoup)——FEC引入的问题收尾
本文主要简单解释了一下FEC的编码和解码的实现,同时展示了经过我修改的webrtc源码。之前文章中引入fec的部分还存在问题。主要是因为使用了同一条ssrc导致flexfec内部出现异常。我们需要在解码的部分所有判断ssrc的地方都区别一下media包和fec包才行。如果不区别这个问题会造成小部分fec包无法恢复,但大部分都是正常的。
2022-10-08 19:22:34
2660
2
原创 流媒体学习之路(WebRTC)——GCC分析(2)
本模块主要针对趋势线滤波模块进行理论分析与解释,并对比旧的卡尔曼滤波器内容进行分析,来得到调整参数的参考。本文主要介绍了如何根据时延梯度得到网络状态,判断网络拥塞状况,并结合WebRTC相关源码进行分析。当我们得到当前网 络拥塞状况后,就要对发送码率进行调节,以适应当前网络。后续文章我们将研究如何根据网络状态进行相应码率调整。
2022-09-30 17:10:05
1219
1
原创 流媒体学习之路(mediasoup)——GCC的Feedback信令回复(8)
本文讲了mediasoup的拥塞控制接收端类,讲得稍微细一些。其实主要就两个功能产生发送端带宽估计的feedback报文、产生接收端估计的remb报文(已废弃)。remb和transport-cc两个在mediasoup中无法同时使用,所以这俩只有一个会在工作时运行,之后的文章我们会跟着分析一下webrtc的gcc算法和发送控制类——TransportCongestionControlClient。httpshttpshttps。...
2022-07-20 15:25:10
946
原创 流媒体弱网优化之路(FEC+mediasoup)——mediasoup的Nack优化以及FEC引入
流媒体学习之路(mediasoup)——前后端交互全流程解析(8)文章目录流媒体学习之路(mediasoup)——前后端交互全流程解析(8)
2022-06-09 11:20:41
4191
12
原创 流媒体弱网优化之路(FEC)——FEC的应用奥秘(附demo)
流媒体学习之路(FEC)——FEC应用仿真与测试(附demo)文章目录流媒体学习之路(FEC)——FEC应用仿真与测试(附demo)一、FEC应用简析1.1 FEC原理简述1.2 FEC编码的不同二、FEC丢包模型三、测试对比四、结果与分析提示:demo链接在文章末尾,有兴趣自取。一、FEC应用简析 前面的NACK方案能在延迟较小的情况下快速补偿丢包,但是随着丢包率上升以及延迟增加,纯NACK方案逐渐无法满足传输需求了。那么在已知高延迟高丢包的环境下,我们可以通过提前冗余去做数据补充,让我们可以
2022-03-10 17:10:19
3716
11
原创 流媒体弱网优化之路(FEC)——FEC原理简介
流媒体学习之路(NACK)——纯NACK方案的优化探索文章目录流媒体学习之路(NACK)——纯NACK方案的优化探索一、信道保护措施背景介绍1.1、ARQ丢包重传1.2、ABC码率自适应1.3、FEC前向纠错二、FEC基本原理介绍2.1、静态FEC基本原理2.1.1、一阶冗余2.1.2、二阶冗余2.2、动态FEC介绍2.2.1、动态FEC的发展2.2.2、WebRTC中的FEC三、业务相关的FEC(上行弱网时推流使用FEC)四、结语一、信道保护措施背景介绍 我们都知道,随着半导体集成技术的发展
2022-03-10 16:54:01
9839
原创 STL源码剖析阅读笔记四(序列容器list)
一、概述 list和上一章的vector都是我们平时开发最常用到的容器。但与vector不一样的是,list并非一个绝对固定的连续空间的容器,之所以设计成这样还是考虑了连续空间删除插入的时间消耗。STL的list事实上是一个双向链表,了解链表概念的应该明白,这种前后可移动的链表结构提供了非常灵活的操作性。二、定义2.1 节点形式 它的节点形式可以比较形象化地展示为下图的样子: 而具体的代码也很简单:template <class T> struct __list_node {
2022-03-04 15:23:25
701
原创 流媒体弱网优化之路(NACK)——纯NACK方案的优化探索
流媒体学习之路(NACK)——纯NACK方案的最高性能文章目录流媒体学习之路(NACK)——纯NACK方案的最高性能一、NACK简介二、Nack的理解2.1 一种补救策略2.2 什么时候要?2.3 要多少?2.4 怎么要?三、计算分析3.1 rtt强相关3.2 补包次数计算3.3 Nack的定时发送3.4 nack重传限制四、实验 近期在针对纯丢包场景做一些简单的探索实验,一个让我困扰的问题就是:不使用FEC而只是通过纯NACK进行补偿,到底能在实验环境下抵抗多少的丢包呢?每一次丢包补偿的最大时长
2022-03-01 15:25:45
9243
16
原创 流媒体学习之路(mediasoup)——simulcast 与 svc 简介(7)
流媒体学习之路(mediasoup)——simulcast 与 svc(7)文章目录流媒体学习之路(mediasoup)——simulcast 与 svc(7)
2021-11-10 16:34:47
6594
原创 STL源码剖析阅读笔记三(序列容器vector)
一、概述 我们平时使用数组(array)时是不是经常因为扩容问题而头疼,其实vector与array之间多的就是空间配置的部分。本章序列容器的vector对array进行了空间管理的封装以及几种迭代器的封装,从而实现了我们所认识的第一个序列容器——vector。二、定义式 代码示例:// alloc 是 SGI STL 的空間配置器,見第二章。 template <class T, class Alloc = alloc> class vector {public:// vect
2021-11-08 18:02:15
142
转载 C++基础——std::optional(转载)
一、前言 有时我们会用一个值来表示一种“没有什么意义”的状态,这就是C++17的std::optional的用处。 在编写程序时,我们常常遇到一种情况,那就是我们不总是有一个固定值来表示一个事物。例如,找出文本中的第一个偶数(如果存在的话)。或者一个类有一个可选的成员函数,即一个不是总需要被设置的成员函数。在以前的代码中,这些情况一般使用魔术值(magic value)或者空指针(null pointers)来表示。一个魔术值可以是一个空的字符串、0、-1或者一个最大的非负值(例如std::str
2021-10-13 11:16:17
1815
原创 C++基础——final 关键字
C++中,final关键字用于修饰类时,有以下作用: 1.禁止继承:c++11特性中,将类标记为final,意味着无法继承。class test final{ ......}; 2.禁止重写方法:当方法被标记为final时,在子类中无法重写该方法。class test{ public: test(); virtual void func() final;};...
2021-10-12 11:10:22
4766
1
原创 流媒体学习之路(BBR算法应用)——BBR算法简介
流媒体学习之路(BBR算法应用)——BBR算法简介文章目录流媒体学习之路(BBR算法应用)——BBR算法简介
2021-10-11 16:51:57
4859
原创 流媒体学习之路(mediasoup)——拥塞控制分析(6)
流媒体学习之路(mediasoup)——拥塞控制分析(6)文章目录流媒体学习之路(mediasoup)——拥塞控制分析(6)
2021-10-11 16:47:32
2132
4
原创 流媒体学习之路(mediasoup)——各业务类初始化(5)
流媒体学习之路(mediasoup)——各业务类初始化(5)文章目录流媒体学习之路(mediasoup)——各业务类初始化(5)一、OpenSSL二、LibSRTP2.1 SRTP的协议格式2.2 SRTCP的协议格式main函数中,各个模块初始化:try { // Initialize static stuff. DepOpenSSL::ClassInit(); DepLibSRTP::ClassInit();// DepUsrSCTP::ClassInit(); DepL
2021-10-09 16:03:35
929
原创 C++基础——内联函数(转载)
C++基础——内联函数(转载)文章目录C++基础——内联函数(转载)前言前言 C++ 内联函数是通常与类一起使用。如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。 对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数。 如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字 inline,在调用函数之前需要对函数进行定义。如果已定义的函数多于一行,编译器会忽略 inli
2021-08-09 10:58:53
226
原创 C++基础——嵌套类
C++基础——嵌套类文章目录C++基础——嵌套类前言前言 在一个类的内部定义另一个类,我们称之为嵌套类(nested class),或者嵌套类型。之所以引入这样一个嵌套类,往往是因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现。 这个可以这样理解:有一些工作我们不想被用户知道怎么实现的,那么我们就把这些工作交给类内的嵌套类来实现,然后对我提供一个接口即可。class A { class Imp; Imp* imp
2021-08-06 11:07:35
1306
原创 流媒体学习之路(mediasoup)——流数据传输(4)
流媒体学习之路(mediasoup)——流数据传输(4)文章目录流媒体学习之路(mediasoup)——流数据传输(4)一、Router的建立二、C++部分2.1 UnixStreamSocket创建2.2 UnixStreamSocket2.3 OnRead函数:2.4 OnUvRead函数:2.5 UserOnUnixStreamRead:2.6 OnConsumerSocketMessage2.7 Request2.8 OnChannelRequest三、总结一、Router的建立 Rou
2021-08-05 20:09:04
1459
原创 流媒体学习之路(mediasoup)——信令传输(3)
流媒体学习之路(mediasoup)——信令传输文章目录流媒体学习之路(mediasoup)——信令传输一、Node.js部分二、C++部分2.1 UnixStreamSocket创建2.2 UnixStreamSocket2.3 OnRead函数:2.4 OnUvRead函数:2.5 UserOnUnixStreamRead:2.6 OnConsumerSocketMessage2.7 Request2.8 OnChannelRequest三、总结一、Node.js部分 mediasoup——
2021-08-04 20:53:36
1269
2
原创 流媒体学习之路(mediasoup)——Worker(c++)libuv(番外)
流媒体学习之路——Worker(c++)libuv(番外)提示:当mediasoup进程启动时,会检测Node.js服务器是否启动。随后初始化需要用到的各个模块。分别启动:libUV、建立管道通信模块、读取config、OpenSSL模块、libSRTP模块、UsrSCTP模块、libWebRTC模块、Crypto加密模块、DtlsTransport传输模块、SrtpSession会议模块、两个业务channel模块。下面对整体的Worker用到的开源模块进行分析对比:文章目录流媒体学习之路——
2021-08-02 10:44:36
1285
原创 流媒体学习之路(mediasoup)——Node.js部分简析 (2)
流媒体学习之路——Node.js部分分析 (2)提示:本文将集中分mediasoup-demo的server.js部分以及mediasoup源码Node.js部分。文章目录流媒体学习之路——Node.js部分分析 (2)一、mediasoup-demo1.1 server.js分析1.2 MCU1.3 SFU1.4 小结二、mediasoup架构分析三、总结一、mediasoup-demomediasoup-demo提供了一个可以部署的webrtc服务器,具体的部署流程此处不赘述,感兴趣的朋友
2021-05-26 20:21:23
1248
原创 流媒体学习之路——初识mediasoup (1)
流媒体学习之路——初识mediasoup (1)提示:硕士毕业后转行从事了流媒体相关工作,希望能通过一系列开源项目的学习来扩展自己的知识树。该系列将尝试从著名的C++开源流媒体服务器中学习其设计思想、代码逻辑,并尝试从自己的角度去理解其中的优点与缺点。文章目录流媒体学习之路——初识mediasoup (1)前言一、多人互动架构二、使用步骤1.引入库2.读入数据总结前言本文作为mediasoup学习的开篇,有必要对目前行业的通用多人互动架构、mediasoup设计思想以及其架构进行了解。参考他人
2020-11-02 15:37:05
1576
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人