- 博客(29)
- 收藏
- 关注
原创 【WebRTC】QoS 拥塞控制 GCC 理论 Sender Side BWE 或 REMB
Sender Side Bandwidth Estimation 发送方带宽预估。Sender Side BWE 是新方案,利用的是 RTCP 中的 TransportCC 协议。Receiver Estimated Maximum Bitrate 接收端预估最大码率。REMB 是旧方案,利用的是 RTCP 中的 REMB 协议。WebRTC 中的拥塞控制算法有三种:GCC、BBR、PCC。GCC 是 WebRTC 的默认算法,GCC 包含基于 丢包 和 延迟 两种情况的算法。以下所有内容都是 GCC 中的
2022-12-04 11:23:35 987
原创 【WebRTC】拥塞控制 GCC 类图
GoogCcNetworkController : 整个 congestion_controller 模块的中心类,是对外的接口AcknowledgedBitrateEstimator : 估算当前的吞吐量。BitrateEstimator : 使用滑动窗口 + 卡尔曼滤波计算当前发送吞吐量。RobustThroughputEstimator:更鲁棒的ACK码率(使用贝叶斯估计计算的接收方码率)估计。ALR,即 Application Limit Region,即应用本身存在一些受限(非网络带宽导致),会导
2022-12-03 15:03:21 507
原创 【音视频基础】H264格式分析
H264是基于运动补偿的视频编码标准。所谓编码我的理解就是对数据进行压缩便于网络传输。而视频编码就是依据图像帧的像素块之间的相似性对图像进行压缩。H264结构中,一幅图像编码后的数据叫一帧,一帧由一个或多个Slice片组成,一片由一个或多个MB宏块组成,一个宏块由16*16的yuv数据组成。宏块是H264编码的基本单位。H264定义了三种帧,I帧,P帧,B帧。group of picture 两个I帧之间的所有帧为一个GOP。H264对关联度高的视频帧进行分组,其算法是在相邻几幅图像画面中,一般有差别的像素
2022-12-03 14:39:10 4119 2
原创 【音视频基础】RGB图像的缩放
目标像素的色值 等于 等比原图距离最近像素点的色值。双线性插值目标像素的色值 等于 等比原图像素点周围的四个像素点色值的双线性插值。线性插值:像素转换:双线性插值应用公式推导:
2022-12-03 14:29:08 551
原创 【音视频基础】RGB 与 YUV
指的是图像中每一个像素点在计算机中用什么编码方法表示。基本三原色:红(Red)、绿(Green)、蓝(Blue)。根据可见光的波长识别颜色。每个像素16位,2字节。RGB分量分别使用5位、6位、5位。每个像素16位,2字节。RGB分量分别使用5位、5位、5位(最高位不用)。每个像素24位,3字节。RGB分量分别使用8位。注:内存中RGB各分量的排列顺序为:BGR BGR BGR …每个像素32位,4字节。RGB分量分别使用8位,最后保留8个字节。注:内存中RGB各分量的排列顺序为:BGRA BGRA BGR
2022-12-03 14:22:49 677
原创 【Qt记录】Windows 窗口层级(Z-order)
功能:软件有一个提示弹窗,希望让他永远在最上面,保证该窗口在任何情况下不会被遮挡。由上面的问题就查找对应的api找到了SetWindowPos()。在说这个函数之前,先了解以下概念:其实这玩意翻译成 Z轴 更好。首先对于显示器而言,以左上角为坐标原点,向右为x轴,向下为y轴。除此之外,由里向外就是z轴,也就是所谓的Z-order。top of the Z order:Z轴的最顶层,虽然是Z序里最上面的,但它并不一定是最最上面的。按照Z轴的顺序,由外向里,分别是:顶端窗口–顶层窗口–子窗口。顶端窗口有TOPM
2022-12-03 13:36:37 2793
原创 【Qt记录】属性 Q_PROPERTY
Qt 拥有一个属性系统。我经常在QSS中使用配合在代码中使用设置label的QSS样式。以上其实就是Qt属性系统的一种使用方式。但是,Qt 属性系统从 setProperty() 这个函数就可以看出,其类似一个 key-value 的键值对。并且,setProperty() 可以配置 property() 来使用。前一个是设置属性,后一个是获取属性。通过设置属性和获取属性可以增强编码的便捷性。举个例子:我通过设置 “status” 属性,获取当前某控件的状态。至少节省了一个变量,两中状态的设置。如果
2022-12-03 13:18:48 1003
原创 C++:14.C++11 新标准:foreach、右值引用&&、lambda表达式、语言级别的线程与锁
关键字和新语法1、delete 指定删除类的成员方法 在类的成员方法后面写 = delete 就将该成员方法删除,用户无法调用。智能指针unique_ptr就是将对象的拷贝构造和operator= delete删除了2、auto 自动的 根据右表达式,自动推倒出左边变量的类型。auto it = vec.begin() 根据等号...
2018-11-26 14:13:47 1602
原创 C++:13.多重继承(菱形继承),虚继承,虚基类
多重继承:就是一个派生类多个基类,几乎与单继承是一致的。唯一考点:菱形继承结构(B类C类继承A类,D类继承A类。),产生问题,派生类有多份基类的数据。 解决办法:B C都采用虚继承,只有一个虚继承也无法解决该问题。虚继承:厉害了,virtual不仅可以声明虚函数,还可以设定继承方式:虚继承 被采用虚继承的基类 A,称为虚基类此时派生类的大小扩大:会有虚...
2018-11-14 19:22:01 431
原创 C++:13.多态、虚函数
多态与虚函数:什么是虚函数:用virtual关键字声明的函数都是虚函数。虚函数存在的唯一目的,就是为了实现多态(动态绑定/运行时绑定)。virtual 关键字只在类定义中的成员函数声明处使用,不能在类外部写成员函数体时使用。所有派生类中具有覆盖关系的同名函数都将自动成为虚函数。(派生类转化为的虚函数,最好也写上virtual,清晰么。)静态成员函数不能是虚函数。再说简单点:有v...
2018-11-12 20:06:59 312
原创 C++:12.继承与派生
为了支持代码的复用,继承与派生在C++中就显得十分重要。继承与派生:当定义一个新的类 B 时,如果发现类 B 拥有某个已写好的类 A 的全部特点,此外还有类 A 没有的特点,那么就不必从头重写类 B,而是可以把类 A 作为一个“基类”(也称“父类”),把类 B 写为基类 A 的一个“派生类”(也称“子类”)。这样,就可以说从类 A “派生”出了类 B,也可以说类 B “继承”了类 A。...
2018-11-12 16:50:04 262
原创 C++:11.异常操作
C++ 的异常操作1.、异常涉及的关键字有哪些? throw 抛出异常 。 try 中包含的是可能出现异常的语句,后面可以跟多个catch。 catch 用于捕获异常后面括号中跟的是异常的类型,其中包含的是处理方法。解释一下重抛异常:当catch捕获到一个异常,可以在这个catch中再次throw抛出异常,但这个throw后面可以不跟内容,表示继续抛出原来...
2018-11-11 22:42:25 403
原创 C++:10.智能指针
智能指针作用:一般的指针,存在资源泄露的问题。而智能指针一定会保证资源自动释放(会自动调用delete),不用用户参与。为什么会自动调用delete?实际上智能指针也是用类定义的,利用栈上的指针出函数就会自动调用析构函数的特点。所以不能使用堆上的指针,因为出函数不会析构。也不要定义全局的,因为程序结束自己就释放了。头文件:#include <memory>1、带...
2018-11-11 17:50:28 270
原创 C++:09.Top K问题
没啥说的:top k大 用小跟堆; top k小 用大根堆优先级队列默认 使用 大根堆 可以求top K小 上代码:求Top K大#include<iostream>#include <queue> priority_queue#include <ctime>#include <functional> greater...
2018-11-08 21:03:45 213
原创 C++:08.泛型算法、仿函数(函数对象)、bind1st 与 bind2nd
置顶推荐转载引用的博文(讲解的很详细):https://www.cnblogs.com/ne-liqian/p/7889631.html 泛型算法:泛型算法是STL库里面定义的一些算法,这些算法可以用一个接口操作各种数据类型,因此成为泛型算法。泛型算法只依赖于迭代器的操作,而不是依赖于容器。头文件:#include <algorithm> 和 ...
2018-11-07 20:52:02 349
原创 C++:07.无锁数据结构
看了很多博客,大多讲的很高深,看起来很费劲,能力有限只能简单总结一下。什么是无锁数据结构:先说一下锁是干嘛的,在多线程环境下,由于很多操作不是原子操作,导致多个线程同时做了一个工作,为了防止这种情况的发生,我们通过对执行代码前上锁,让其他进程无法执行该步骤,再执行完后解锁,其他线程才能完成该步骤。再说一下为什么要无锁数据结构:上锁解锁的过程是很消耗资源的,因为要从用户态切到内核态。简单...
2018-11-07 17:26:49 841
原创 C++:06.Nginx内存池
先了解一下Nginx:Nginx是一个高性能的HTTP反向代理服务器,接收浏览器请求。其特点是占有内存少,并发能力强,稳定性高。nginx有什么功能?接收http服务,正向反向代理(负载均衡)。正向代理代理客户端,反向代理代理服务器,反向代理也称作负载均衡器http协议本身就是一个短链接,无状态的协议内存池的好处:减少向系统申请和释放内存的时间开销,解决内存频繁分配产...
2018-11-05 22:14:13 230
原创 C++:05.单例模式
单例模式一个类只能被实例化一次,产生一个对象。在类中,要构造一个实例,就需要通过构造函数,所以为了防止在外部调用类的构造函数而构造实例,需要将构造函数的访问权限标记为protected或private;并且需要提供给全局访问点,就需要在类中定义一个static函数,返回在类内部唯一构造的实例。懒汉式:在第一次用到类实例的时候才会去实例化,访问量较小时,采用懒汉式,以时间换空间。并不...
2018-11-04 20:47:39 186
原创 C++:04.容器+迭代器+空间配置器
容器:顺序容器/关联容器顺序容器:向量容器vector、双端队列 deque、双向链表 list。元素在容器中的位置同元素的值无关,即容器不是排序的。vector 是可变长的动态数组。#include <vector>。随机访问、内存是连续的、方便排序、二分搜索。可以嵌套形成二维动态数组vector<vector<int> > v(3); //...
2018-11-04 17:13:47 268
原创 C++:01.从C到C++:浅拷贝,优化规则,内存分配
new int[20]和new int[20]()有()初始化为该类型的默认值 没有(为随机值) 开辟单个元素可以在()内随意初始化,但开辟数组是()内不能写入数字类的成员方法在类体内定义和在类外定义:1.类外定义的成员方法,在方法名字前面加类类型的作用域2.类外定义的在调用时,有函数的正常开销(函数运行需要再栈上开辟内存);在类体内定义的函数,都被自动处理成inl...
2018-10-29 19:02:58 396
原创 C++:03.运算符重载
运算符重载的目的:让对象的运算表现的和内置类型的运算一样。运算符重载函数,返回值一般不会是void,例如:连续的=就无法用void实现,一般用类类型的引用,可以保证连续运算。class CComplex 复数类{public: CComplex(int real = 10, int image = 10):mreal(real), mimage(image) {...
2018-10-29 18:34:01 159
原创 C++:02.类与对象:struct于class,拷贝构造,静态成员,常对象,嵌套类,友元,类模板
struct与class:在C语言中struct定义结构体,在C++中struct与class都是定义类,区别在struct默认public,class默认private。还有一种说法:没有成员函数的 struct 还是称作“结构”,结构变量不是对象;有成员函数的 struct 就是类。在.c文件中访问结构体,不可以省略structtypedef struct Node{ int...
2018-10-26 17:12:40 620
原创 C++:01.从C到C++:引用,inline,函数重载,全局和局部变量,this,new与malloc
头文件:C++的标准输入输出头文件#include <iostream>。一般还配有using namespace std;表示使用std名命空间。在C++中,声明一个函数时,可以为函数的参数指定默认值。当调用该函数时,如果没有参数,将使用默认值作为参数。面向对象语言:四大特征:封装(在语言上是通过访问限定符体现的:public private) 继承 ...
2018-10-24 22:32:13 211
原创 Linux进程间通信——04共享内存
共享内存:共享内存时最快的一种IPC(进程间通信)。顾名思义就是两个不相关的进程访问同一个逻辑内存。为什么快:管道存在数据的拷贝。通过buffer。而内存共享,直接放入内存中。缺陷:共享内存并没有提供同步机制。也就是说A,B可能同时写入数据,后写的数据会将前面写的数据覆盖掉。所以,我们用信号量对它进行控制。函数:头文件:#include <sys/shm.h>...
2018-10-24 16:14:28 238
原创 Linux进程间通信——03消息队列
消息队列:消息:数据+类型 给数据一种特殊的标志队列:先进先出,但其类似优先级队列。消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法。每个数据块都有一个特定的类型,接收方可以根据类型来有选择地选择接收数据,而不一定像管道和命名管道那样必须先进先出的方式接收数据。消息队列也有和管道一样的不足,就是每个消息的最大长度是有上限的,每个消息队列的总的字节数有上限,系统上消息...
2018-10-24 14:33:02 227
原创 Linux进程间通信——02信号量
信号量的作用:主要用于同步和互斥,防止多个进程同时访问一个共享资源,我们用信号量来保证同一时刻,只有一个执行线程访问临界区(临界区是一个独占式的资源)。它一种特殊的计数器,当信号量的值>0时,其记录的是可被访问的临界资源的个数,当信号量的值<0时,记录的是等待访问临界资源的进程的个数。信号量只有两个操作:P操作(原子减一,如果值为0,则阻塞),V操作(原子加一)。一般情况信号量...
2018-10-22 19:14:49 209
原创 Linux进程间通信——01管道
进程间通信:对于每个进程来说,都有一份属于它自己的内存资源,并且独占这份内存资源。而进程间通信的目的就是让不同的进程间能看到一份公共的资源。所有交换的数据必须通过内核来传递,在内核中开辟一块缓冲区,通过这块缓冲区来实现数据的传递,内核提供的这种机制称为进程间通信。进程间通信的方法:1、管道 2、信号量 3、消息队列 4、共享内存 5、套接字(只有套接字可以跨主机)匿名管道:pi...
2018-10-22 17:17:09 210
原创 交换排序,冒泡排序,选择排序
交换排序for(int i=0;i&amp;amp;lt;length-1;i++) { for(int j=i+1;j&amp;amp;lt;length;j++) { if(arr[i]&amp;amp;gt;arr[j]) { int temp=arr[i]; arr[i]=arr[j]; arr[j...
2018-05-05 16:57:46 4924 6
原创 void *的使用
void * 为 “不确定类型指针”。 void *不可以解引用(1)void *可以接受任何类型的赋值: 任何类型的指针都可以直接赋值给void *型指针,无需进行强制类型转换,相当于void *包含了其他类型的指针。 (2)void *可以赋值给任何类型的变量 但是需要进行强制转换,应为void *的范围较大,所以强制转换,使其进行范围缩......
2018-04-25 17:34:47 6276 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人