摘要: RateTracker主要作用是求最近一段时间间隔内的平均速率,先看它的定义: class RateTracker { public: RateTracker(int64_t bucket_milliseconds, size_t bucket_count); virtual ~RateTracke 阅读全文
posted @ 2020-12-05 11:07 星星,风,阳光 阅读(869) 评论(0) 推荐(0) 编辑
摘要: RateLimiter是webrtc中实现的限流工具,被用在诸如限制重传包数量等地方。它依赖于之前介绍的速率计算器RateStatistics。 先看它的定义: class RateLimiter { public: RateLimiter(Clock* clock, int64_t max_win 阅读全文
posted @ 2020-12-04 09:35 星星,风,阳光 阅读(682) 评论(0) 推荐(0) 编辑
摘要: RateStatistics这个类的作用为记录一个时间窗口内的速率值,并返回当前时间区域内的码率值。 首先引入一个桶的定义: struct Bucket { explicit Bucket(int64_t timestamp); int64_t sum; // Sum of all samples 阅读全文
posted @ 2020-12-03 20:33 星星,风,阳光 阅读(701) 评论(0) 推荐(0) 编辑
摘要: 1. 实时音视频开发主要步骤 2. 概述 前面我们通过两篇文章分别介绍了视频采集的两种方式:采集摄像头和采集屏幕。获取数据之后,如果是要本地显示,那么就像我们之前做的那样,直接渲染出来就行;方式如果是进行存储或者进行传输,往往需要对数据进行编码压缩。 webrtc中的视频编解码部分的主要实现是位于m 阅读全文
posted @ 2020-10-23 15:33 星星,风,阳光 阅读(3764) 评论(0) 推荐(0) 编辑
摘要: 1. 实时音视频开发主要步骤 2. 屏幕采集 在上一篇文章中我们讲述了如何采集摄像头的数据,这篇文章就主要讲述如何采集屏幕的数据。 摄像头采集使用的模块主要是webrtc::VideoCaptureModule,代码位于modules/video_capture下; 屏幕采集主使用的模块主要是web 阅读全文
posted @ 2020-10-22 10:06 星星,风,阳光 阅读(4123) 评论(1) 推荐(0) 编辑
摘要: 1. 实时音视频开发主要步骤 2. 数据采集 音频的采集主要来自麦克风; 视频的采集源主要有两个: 1. 摄像头; 2. 屏幕。 这里先介绍如何采集摄像头数据。 2.1 环境 我这里使用的是Ubuntu,因此和windows会稍微有些差别,但是都可以通过example下的peerconnection 阅读全文
posted @ 2020-10-21 11:43 星星,风,阳光 阅读(4134) 评论(10) 推荐(0) 编辑
摘要: 可以直接调用windows api: #include <Windows.h> #define MONITOR_ON -1 #define MONITOR_OFF 2 #define MONITOR_STANBY 1 int main() { //锁屏 LockWorkStation(); //息屏 阅读全文
posted @ 2020-09-25 16:58 星星,风,阳光 阅读(2831) 评论(0) 推荐(0) 编辑
摘要: 在做webrtc测试时,会发现它提供的peerconnection_client是抓取摄像头画面的,在没有摄像头的机器上,它是不会传输视频数据的。这对于想在我的Linux台式机上调试webrtc代码不大方便。 实际上,在src/modules/video_capture/linux/device_i 阅读全文
posted @ 2020-08-14 11:18 星星,风,阳光 阅读(5418) 评论(0) 推荐(0) 编辑
摘要: 1. 概述 WebRTC使用SR/RR包来计算rtt的 SR报文格式: RR报文格式: 2. 相关代码 RTCPSender::BuildSR RTCPSender::BuildRR RTCPSender::SendCompoundRTCP RTCPReceiver::HandleReceiverR 阅读全文
posted @ 2020-08-03 09:11 星星,风,阳光 阅读(1760) 评论(0) 推荐(0) 编辑
摘要: 想要在Windows上能查看崩溃堆栈,需要符号文件,也就是对应程序对应版本的pdb文件: 拿到崩溃后breakpad产生的minidump文件,直接用windbg的File选项卡的Open Crash Dump打开. 然后选择File选项卡的Symbol File Path导入pdb文件,注意选择的 阅读全文
posted @ 2020-07-21 18:05 星星,风,阳光 阅读(7213) 评论(0) 推荐(0) 编辑
摘要: 介绍 组合模式: 又叫部分整体模式,是用于把一组相似对象当做一个单一对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次. 属于结构型模式. 目的: 将对象组合成树形结构以表示"部分-整体"的层次关.组合模式使得用户对单个对象和组合对象的使用具有一致性. 优点: 高层模块调用简单; 自由度 阅读全文
posted @ 2020-06-17 11:15 星星,风,阳光 阅读(416) 评论(0) 推荐(0) 编辑
摘要: 介绍 外观模式: 隐藏系统的细节,只向客户端提供一个可访问系统的接口. 属于结构型模式,通过向现有系统添加一个接口,来隐藏系统的复杂性. 目的: 定义一个高层接口,为子系统中的一组接口提供一个一致的界面,使得子系统更易被使用. 关键代码: 在客户端个复杂系统之间再加一层,这一层将调用顺序\依赖关系处 阅读全文
posted @ 2020-06-17 10:13 星星,风,阳光 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 介绍 单例模式,顾名思义,就是保证一个类只一个对象. 单例模式可以分为懒汉模式和饿汉模式两种: 懒汉模式:不到万不得已不去实例化对象,也就是在第一次使用到类实例时才会去实例化一个对象.访问量较小时,采用懒汉模式,可以达到时间换空间的效果. 饿汉模式: 在定义单例对象时就初始化.访问量较大时,或者可能 阅读全文
posted @ 2020-06-16 11:27 星星,风,阳光 阅读(180) 评论(0) 推荐(0) 编辑
摘要: 介绍 桥接模式: 将抽象部分和实现部分分离,使它们可以独立变换. 属于结构型模式. 目的: 在有多种可能变化情况下,使用继承可能会造成类爆炸的问题,扩展起来不灵活. 使用场景: 当一个对象具有多个变化因素时,考虑依赖于抽象的实现,而不是具体实现; 当多个变化因素在多个对象之间共享时,考虑将这部分的变 阅读全文
posted @ 2020-06-16 10:49 星星,风,阳光 阅读(271) 评论(0) 推荐(0) 编辑
摘要: 介绍 装饰器模式:允许向一个现有的对象添加新的功能,同时又不改变结构. 属于结构型模式,作为现有类的一个包装. 目的: 动态地给一个对添加一些额外的职责,就增加功能来说,装饰器模式相比生成子类更加灵活. 优点: 装饰类和被装饰类是相互独立的,不会相互耦合; 是继承的一个替代模式,装饰模式可以动态的扩 阅读全文
posted @ 2020-06-16 09:45 星星,风,阳光 阅读(586) 评论(0) 推荐(0) 编辑
摘要: 官方文档: http://webrtc.github.io/webrtc-org/native-code/development/ 1.环境准备 1.1 安装depot_tools git clone https://chromium.googlesource.com/chromium/tools/ 阅读全文
posted @ 2020-06-15 20:06 星星,风,阳光 阅读(10933) 评论(0) 推荐(0) 编辑
摘要: 介绍 作用: 作为两个不兼容接口之间的桥梁,属于结构型模式. 何时使用: 系统需要使用现有类,但是该类的接口并不符合系统的要求; 通过接口转换,将一个类插入到另一个类中. 关键方案: 继承或依赖(推荐). 优点: 可以将现有的类转换成系统可以使用类; 提高了类的复用; 增加类的透明度 缺点: 过多地 阅读全文
posted @ 2020-06-15 12:00 星星,风,阳光 阅读(292) 评论(0) 推荐(0) 编辑
摘要: 1. 介绍 目的: 定义一系列的算法(行为),把它们一个个封装起来,并且使它们可以互替换(继承接口). 关键: 实现同一个接口. 优点: 算法之间可以互相替换; 可以避免多重条件判断; 扩展性良好. 缺点: 策略类会比较多; 所有策略都需要对外暴露. 使用场景: 一个对象可能存在多种行为,需要使用多 阅读全文
posted @ 2020-06-15 11:10 星星,风,阳光 阅读(385) 评论(0) 推荐(0) 编辑
摘要: 这里以cpplib_base 项目集成gtest为例,说明如何快速将gtest应用到我们自己的项目中. 1. 集成googletest 对于git管理的项目,我们可以使用submodule将gtest作为子模块集成到我们的项目中: git submodule add https://github.c 阅读全文
posted @ 2020-05-28 10:49 星星,风,阳光 阅读(2358) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 什么是树型数组? 顾名思义,树型数组就是用数组来模拟树形结构. 有什么用? 可以解决大部分基于区间上的更新以及求和问题 : 比如求一个数组的1~m之间的和,多次操作,它的复杂度在O(mn),这个问题使用树型数组就更高效. 2. 树型数组介绍 介绍树型数组之前,需要先介绍树型数组中最重要的 阅读全文
posted @ 2020-05-27 17:30 星星,风,阳光 阅读(392) 评论(0) 推荐(0) 编辑
摘要: [TOC] 1. 网络协议 1.1 TCP TCP报头: 最小报头: 20Byte. 1.1.1 TCP三次握手 为什么需要三次握手?不是两次或者四次? 1. 首先得说,TCP三次握手其实是可以理解成四次,之所以是三次是因为服务端发送的是 包,即合并了两个包,导致握手比挥手少了一次。之所以能这样,是 阅读全文
posted @ 2020-05-20 20:02 星星,风,阳光 阅读(361) 评论(0) 推荐(0) 编辑
摘要: WebRTC建立通信过程 基础设施:必要的信令服务和 NAT 穿越服务 clientA 和 clientB 分别创建 RTCPeerConnection 并为输出端添加本地媒体流。如果是视频通话类型,则意味着,两端都需要添加媒体流进行输出。 本地 ICE 候选信息采集完成后,通过信令服务进行交换。 阅读全文
posted @ 2020-05-04 15:26 星星,风,阳光 阅读(1535) 评论(0) 推荐(0) 编辑
摘要: 1. 简介 字典在Redis中应用广泛,Redis数据库的底层就是使用字典来实现的,对数据库的增删查改也都是建立在字典的操作之上的。 此外,字典还是哈希键的实现之一。 2. 实现 2.1 哈希表 哈希表由 结构定义: 2.2 哈希表节点 哈希表节点使用dictEntry结构表示,每个dictEntr 阅读全文
posted @ 2020-04-21 13:09 星星,风,阳光 阅读(201) 评论(0) 推荐(0) 编辑
摘要: 1. 简介 链表在Redis中使用广,包括列表键的事件、客户端的状态保存等都使用了链表。 2. 实现 2.1 链表节点 结构来表示链表节点: 其实也就是我们平常数据结构中的双向链表节点的定义。 2.2 链表 结构来表示链表: 需要注意一下几点: 双端:带有head和tail指针,指向头尾的复杂度都是 阅读全文
posted @ 2020-04-18 15:47 星星,风,阳光 阅读(493) 评论(0) 推荐(0) 编辑
摘要: 1. 简介 Redis没有使用C中默认的字符串(字符数组),而是自己构建了一个简单动态字符串(SDS)的抽象类型,并且作为默认的字符串。 Redis中会使用C中的字符串作为字符常量,用在无需修改的地方,如日志; 当字符串会被修改时,就是使用SDS; 此外,SDS还会被用作缓冲区。 2. 定义 结构体 阅读全文
posted @ 2020-04-17 13:26 星星,风,阳光 阅读(309) 评论(0) 推荐(0) 编辑
摘要: 现在已经习惯写MarkDown,但是插入图片一直都是比较麻烦的事情,绝大部分笔记产品对于markdown直接插入图片都是收费的,为此我更换了很多个笔记产品,从有道 》蚂蚁 》语雀,这导致我的笔记都很分散,很容易丢。其实很多人基于github搭建博客系统,我们也可以将github作为一个文件存储服务器 阅读全文
posted @ 2020-04-14 19:31 星星,风,阳光 阅读(867) 评论(3) 推荐(0) 编辑
摘要: 1. 将手机通过usb连接上手机 打开手机的调试模式,通过下述命令确认设备连接成功 2. 确认手机的ip地址 在PC上直接通过adb登录手机的shell环境: 3. 打开adb监听端口 直接在电脑上运行 其中端口可自行选择。 4. 远程连接 现在你可以断开手机和PC的有线连接,直接使用adb命令远程 阅读全文
posted @ 2020-04-10 10:46 星星,风,阳光 阅读(10174) 评论(0) 推荐(0) 编辑
摘要: libevent就是一个基于事件通知机制的库,支持/dev/poll、kqueue、event ports、select、poll和epoll事件机制,也因此它是一个跨操作系统的库(支持Linux、 BSD、Mac OS X、Solaris、Windows等)。 libevent 库实际上是使用对于 阅读全文
posted @ 2020-01-17 15:26 星星,风,阳光 阅读(2408) 评论(0) 推荐(0) 编辑
摘要: WPF入门教程:HelloWord及布局 参考资料:https://www.cnblogs.com/dotnet261010/p/6275821.html 1. 简介 1.1 什么是WPF? WPF:Windows Presentation Foundation,是微软推出的基于Windows Vi 阅读全文
posted @ 2019-12-26 11:42 星星,风,阳光 阅读(638) 评论(0) 推荐(0) 编辑
摘要: 现在我们就利用之前学习到的conan的使用方法,将chromium中的base库打包成一个conan包。 1. 准备源码 chromium本身是通过gn来编译的,这个目前conan并不支持。所以需要把它从chromium代码中抽离出来,这是一个复杂的工作。所幸的是,已有大神做了做方面工作: "htt 阅读全文
posted @ 2019-11-25 09:22 星星,风,阳光 阅读(2340) 评论(0) 推荐(0) 编辑
摘要: 前面总结过如何打包一个存头文件库,那种情况下非常简单,因为只需要将源文件拷贝就行了。现在来研究下如何打包一个正常情况下会生成动态库或静态库的包。参考文档: "https://docs.conan.io/en/latest/creating_packages/getting_started.html 阅读全文
posted @ 2019-11-21 16:01 星星,风,阳光 阅读(3835) 评论(0) 推荐(0) 编辑
摘要: 参考: "https://docs.conan.io/en/latest/howtos/header_only.html?highlight=header%20only" 对于只含头文件的库打包非常简单,以rapidjson为例。 执行创建命令: 然后修改生成的conanfile.py: 如果是手动 阅读全文
posted @ 2019-11-20 21:41 星星,风,阳光 阅读(2924) 评论(0) 推荐(0) 编辑
摘要: 前面我们已经能够使用conan来从公共服务器上拉取C/C++包来集成进我的工程中,但是在实际开发中,我们可能需要自己封装或使用非公开的库,那么自己搭建一个私服是个很现实的需求。 搭建conan私服有几种方式,这里介绍一种目前使用比较多的Artifactory方式。 1. 安装和配置Artifacto 阅读全文
posted @ 2019-11-20 11:15 星星,风,阳光 阅读(6837) 评论(0) 推荐(0) 编辑
摘要: 1. 安装conan 使用pip命令安装conan,如果没有安装pip的,可以先安装好python后,再安装pip。 之后就可以使用conan命令。(注意Linux下需要使用sudo提升权限) 2. 管理远程库 默认conan会添加一个远程库:conan center: 我们可以使用search选项 阅读全文
posted @ 2019-11-16 20:18 星星,风,阳光 阅读(22871) 评论(0) 推荐(4) 编辑
摘要: Chromium是用gn和ninja进行编译的,即gn把.gn文件转换成.ninja文件,然后ninja根据.ninja文件将源码生成目标程序。gn和ninja的关系就与cmake和make的关系差不多。 1. 环境配置 在我们自己的项目中,也可以使用gn来进行编译。 在windows上总是会遇到各 阅读全文
posted @ 2019-11-12 20:28 星星,风,阳光 阅读(17794) 评论(2) 推荐(2) 编辑
摘要: glog是google提供的一个轻量级日志库,有chromium开发经验的人都会发现,它和base库中的日志库非常像,其实base库中的日志库比它更加轻量级。glog在日常开发中的使用非常广泛。这里介绍下它的编译和基本使用方法。 1. 下载 通过git从github拉取最新版本代码: 2.编译 2. 阅读全文
posted @ 2019-11-09 15:04 星星,风,阳光 阅读(19699) 评论(0) 推荐(1) 编辑
摘要: 一. 前言 基于学习ffmpeg和sdl,写一个视频播放器是个不错的练手项目。 视频播放器的原理很多人的博客都有讲过,这里出于自己总结的目的,还是会做一些概况。 二. 视频播放器基本原理 2.1 解封装 视频文件基本上都是将编码好的音频和视频数据封装在一起形成的,因此拿到视频文件的第一步就是先将它解 阅读全文
posted @ 2019-11-04 11:48 星星,风,阳光 阅读(5363) 评论(0) 推荐(0) 编辑
摘要: 1. 高频枚举值或结构体 1.1 SDL_WindowFlags cpp / \brief The flags on a window \sa SDL_GetWindowFlags() / typedef enum { / !!! FIXME: change this to name = (1 阅读全文
posted @ 2019-10-20 22:31 星星,风,阳光 阅读(1431) 评论(0) 推荐(0) 编辑
摘要: SDL是一个跨平台的多媒体库,它通过OpenGL和2D视频帧缓冲,提供了针对音频、视频、键盘、鼠标、控制杆及3D硬件的低级别的访问接口。这里使用较新的SDL2库。 1. 配置SDL开发环境 1.1 下载SDL开发库 下载地址: "http://www.libsdl.org/download 2.0. 阅读全文
posted @ 2019-10-20 16:15 星星,风,阳光 阅读(10553) 评论(0) 推荐(1) 编辑
摘要: 1.gclient简介 gclient是谷歌开发的一套跨平台git仓库管理工具,用来将多个git仓库组成一个solution进行管理。总体上,其核心功能是根据一个Solution的DEPS文件所定义的规则将多个git仓库拉取到指定目录。例如,chromium就是由80多个独立仓库组成。 2.相关概念 阅读全文
posted @ 2019-09-27 11:15 星星,风,阳光 阅读(17185) 评论(0) 推荐(0) 编辑