自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(156)
  • 资源 (24)
  • 收藏
  • 关注

原创 读书时间总结

书籍简介

2023-01-31 11:45:08 251 1

原创 QPS、TPS

Transactions Per Second,意思是每秒事务数,具体事务的定义,都是人为的,可以一个接口、多个接口、一个业务流程等等。一个事务是指事务内第一个请求发送到接收到最后一个请求的响应的过程,以此来计算使用的时间和完成的事务个数。

2022-04-26 16:33:08 798

原创 A记录、CNAME

域名解析就是国际域名或者国内域名以及中文域名等域名申请后做的到IP地址的转换过程。IP地址是网路上标识您站点的数字地址,为了简单好记,采用域名来代替ip地址标识站点地址。域名的解析工作由DNS服务器完成。

2022-04-26 16:17:18 916

原创 一致性哈希算法原理

一致性哈希算法通过一个叫作一致性哈希环的数据结构实现。这个环的起点是 0,终点是2^32 -1, 并且起点与终点连接,故这个环的整数分布范围是 [0, 2^32-1]

2021-11-16 10:52:15 369

原创 CPU核心数,线程数,时间片

CPU核心数,线程数,时间片

2021-10-29 17:10:34 823

原创 互斥锁、自旋锁、读写锁、可重入锁、悲观锁、乐观锁

互斥锁使用场景: 如果你能确定被锁住的代码执行时间很长,就应该用互斥锁

2021-10-29 16:18:01 733 1

原创 git总结

设置username和email$ git config --global user.name "your name"$ git config --global user.email "[email protected]"检出仓库$ git clone​​​​​​​ https://xxxxxxxxxxx 工作流$ git add <filename>$ git commit -m "代码提交信息"$ git push origin master更新$ g

2021-08-05 18:32:44 82

原创 vscode配置

c/c++语法高亮设置C/C++ Themes

2021-08-03 14:33:22 68

原创 Q_OBJECT的作用

Q_OBJECT是Qt中的一个宏。由于Qt的语法是在c++的基础上拓展的,所以在Qt程序的编译过程中,直接用gcc这些标准编译器编译是不可行的,因为gcc不能识别这些拓展性的语法,比如信号和槽(Signal and Slot)。于是Qt引入了moc这一编译器。moc(Meta-Object Compiler),即元对象编译器,Qt 程序在交由标准编译器编译之前,会使用 moc 分析 C++ 源文件,假设它发现某个头文件中包括了 Q_OBJECT这个宏(注意, moc 只处理头文件中标记了Q_OBJECT的

2021-05-27 11:07:46 5206

原创 opengl抗锯齿

抗锯齿在学习渲染的旅途中,你可能会时不时遇到模型边缘有锯齿的情况。这些锯齿边缘(Jagged Edges)的产生和光栅器将顶点数据转化为片段的方式有关。这里我们可以看到一个屏幕像素的网格,每个像素的中心包含有一个采样点(Sample Point),它会被用来决定这个三角形是否遮盖了某个像素。图中红色的采样点被三角形所遮盖,在每一个遮住的像素处都会生成一个片段。虽然三角形边缘的一些部分也遮住了某些屏幕像素,但是这些像素的采样点并没有被三角形内部所遮盖,所以它们不会受到片段着色器的影响。因此完整渲染后

2021-05-25 17:49:40 835 1

原创 opengl实例化

实例化如果我们能够将数据一次性发送给GPU,然后使用一个绘制函数让OpenGL利用这些数据绘制多个物体,就会更方便了。这就是实例化(Instancing)。实例化这项技术能够让我们使用一个渲染调用来绘制多个物体,来节省每次绘制物体时CPU -> GPU的通信,它只需要一次即可。如果想使用实例化渲染,我们只需要将glDrawArrays和glDrawElements的渲染调用分别改为glDrawArraysInstanced和glDrawElementsInstanced。这些渲染函数的实例化版本

2021-05-25 17:08:50 229

原创 opengl几何着色器

几何着色器的输入是一个图元(如点或三角形)的一组顶点。几何着色器可以在顶点发送到下一着色器阶段之前对它们随意变换。然而,几何着色器最有趣的地方在于,它能够将(这一组)顶点变换为完全不同的图元,并且还能生成比原来更多的顶点。#version 330 corelayout (points) in;layout (line_strip, max_vertices = 2) out;void main() { gl_Position = gl_in[0].gl_Position + vec

2021-05-25 16:42:00 211

原创 opengl高级GLSL

GLSL的内建变量着色器都是最简化的,如果需要当前着色器以外地方的数据的话,我们必须要将数据传进来。我们已经学会使用顶点属性、uniform和采样器来完成这一任务了。然而,除此之外,GLSL还定义了另外几个以gl_为前缀的变量,它们能提供给我们更多的方式来读取/写入数据。顶点着色器变量gl_Position,它是顶点着色器的裁剪空间输出位置向量。如果你想在屏幕上显示任何东西,在顶点着色器中设置gl_Position是必须的步骤。GLSL定义了一个叫做gl_PointSize输出变量,它是一个floa

2021-05-25 15:59:55 212

原创 opengl高级数据

OpenGL中的缓冲只是一个管理特定内存块的对象。在我们将它绑定到一个缓冲目标(Buffer Target)时,我们才赋予了其意义。当我们绑定一个缓冲到GL_ARRAY_BUFFER时,它就是一个顶点数组缓冲。OpenGL内部会为每个目标储存一个缓冲,并且会根据目标的不同,以不同的方式处理缓冲。调用glBufferData函数可以填充缓冲对象所管理的内存,这个函数会分配一块内存,并将数据添加到这块内存中。如果我们将它的data参数设置为NULL,那么这个函数将只会分配内存,但不进行填充。glBuffer

2021-05-25 14:51:40 96

原创 opengl帧缓冲

到目前为止,我们已经使用了很多屏幕缓冲了:用于写入颜色值的颜色缓冲、用于写入深度信息的深度缓冲和允许我们根据一些条件丢弃特定片段的模板缓冲。这些缓冲结合起来叫做帧缓冲(Framebuffer),它被储存在内存中。OpenGL允许我们定义我们自己的帧缓冲,也就是说我们能够定义我们自己的颜色缓冲,甚至是深度缓冲和模板缓冲。我们目前所做的所有操作都是在默认帧缓冲的渲染缓冲上进行的。默认的帧缓冲是在你创建窗口的时候生成和配置的(GLFW帮我们做了这些)。有了我们自己的帧缓冲,我们就能够有更多方式来渲染了。创建一

2021-05-24 15:49:13 264

原创 opengl混合、面剔除

OpenGL中,混合(Blending)通常是实现物体透明度(Transparency)的一种技术。透明就是说一个物体(或者其中的一部分)不是纯色(Solid Color)的,它的颜色是物体本身的颜色和它背后其它物体的颜色的不同强度结合。一个有色玻璃窗是一个透明的物体,玻璃有它自己的颜色,但它最终的颜色还包含了玻璃之后所有物体的颜色。透明的物体可以是完全透明的(让所有的颜色穿过),或者是半透明的(它让颜色通过,同时也会显示自身的颜色)。一个物体的透明度是通过它颜色的aplha值来决定的。Alpha颜色值是

2021-05-24 15:16:09 164

原创 opengl深度测试、模板测试

深度测试深度缓冲就像颜色缓冲(Color Buffer)(储存所有的片段颜色:视觉输出)一样,在每个片段中储存了信息,并且(通常)和颜色缓冲有着一样的宽度和高度。深度缓冲是由窗口系统自动创建的,它会以16、24或32位float的形式储存它的深度值。在大部分的系统中,深度缓冲的精度都是24位的。当深度测试(Depth Testing)被启用的时候,OpenGL会将一个片段的深度值与深度缓冲的内容进行对比。OpenGL会执行一个深度测试,如果这个测试通过了的话,深度缓冲将会更新为新的深度值。如果深度测试失

2021-05-24 14:54:05 520

原创 opengl光照

冯氏光照模型现实世界的光照是极其复杂的,而且会受到诸多因素的影响,这是我们有限的计算能力所无法模拟的。因此OpenGL的光照使用的是简化的模型,对现实的情况进行近似,这样处理起来会更容易一些,而且看起来也差不多一样。这些光照模型都是基于我们对光的物理特性的理解。其中一个模型被称为冯氏光照模型(Phong Lighting Model)。冯氏光照模型的主要结构由3个分量组成:环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。下面这张图展示了这些光照分量看起来的样子:环境光

2021-05-20 17:51:06 622

原创 opengl坐标系统

GLMGLM是OpenGL Mathematics的缩写,专门为OpenGL量身定做的数学库.opengl坐标系统OpenGL希望在每次顶点着色器运行后,我们可见的所有顶点都为标准化设备坐标(Normalized Device Coordinate, NDC)。也就是说,每个顶点的x,y,z坐标都应该在-1.0到1.0之间,超出这个坐标范围的顶点都将不可见。我们通常会自己设定一个坐标的范围,之后再在顶点着色器中将这些坐标变换为标准化设备坐标。然后将这些标准化设备坐标传入光栅器(Rasterizer),

2021-05-20 17:34:13 509

原创 opengl图形渲染管线

OpenGL简介一般它被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。实际上OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。GLFWGLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入。GLADGLAD是继GL3W,GLEW之后,当前最新的用来访问OpenGL规范接口的第三方

2021-05-20 16:57:43 220

转载 WebRTC:PeerConnection通信建立流程

WebRTC Peerconnection通信过程中的四种角色:Signaling ServerICE/TURN/STUN ServerRemote PeerLocal Peer通信过程中的基本概念:Room:Signaling Server使用Room的概念对同一组通信的peers进行配对管理,一个room中包含有1个或者多个peers。当没有peers存在时room销毁;当第一个peer连接到signaling server时执行create room动作,此时因为没有其他peers

2021-03-22 15:52:49 392 1

原创 webrtc mixer源码分析

AudioMixer的入口函数为AudioMixerImpl::Mix,功能分为三步:计算输出采样率:CalculateOutputFrequency获取音频数据:GetAudioFromSources混音:FrameCombiner::Combine下面分别对这三步进行分析CalculateOutputFrequency,...

2021-01-20 10:39:20 488 2

原创 RTMP、HTTP-FLV、HLS协议

RTMP概述RTMP协议是应用层协议,是要靠底层可靠的传输层协议(通常是TCP)来保证信息传输的可靠性的。在基于传输层协议的链接建立完成后,RTMP协议也要客户端和服务器通过“握手”来建立基于传输层链接之上的RTMP Connection链接,在Connection链接上会传输一些控制信息,如SetChunkSize,SetACKWindowSize。其中CreateStream命令会创建一个Stream链接,用于传输具体的音视频数据和控制这些信息传输的命令信息。RTMP协议传输时会对数据做自己的格式化

2020-12-28 18:07:02 593

原创 复杂度分析与基本算法思想

算法衡量的维度时间维度:是指执行当前算法所消耗的时间,通常用时间复杂度来描述。空间维度:是指执行当前算法需要占用多少内存空间,通常用空间复杂度来描述。复杂度描述大O符号表示法,即 T(n) = O(f(n)), 其中 n 表示数据规模 ,O(f(n))表示运行算法所需要执行的指令数,和f(n)成正比。常见的时间复杂度量级常数阶O(1)代码执行的行数是固定的:void swapTwoInts(int &a, int &b){ int temp = a; a =

2020-12-17 11:09:26 199

原创 live555 RTSPServer源码分析

GenericMediaServer先分析下 RTSPServer 的父类 GenericMediaServer,GenericMediaServer的功能主要分为三部分。监听服务端端口,收到客户端连接请求时,创建ClientConnection实例和客户端交互。 static int setUpOurSocket(UsageEnvironment& env, Port& ourPort); void incomingConnectionHandlerOnSocket(in

2020-12-14 16:11:29 308

原创 SIGPIPE信号

产生 SIGPIPE 的条件对一个已经收到 FIN 包的 socket 调用 read 方法,如果接收缓冲已空,则返回 0,这就是常说的“连接关闭”表示。对一个已经收到 FIN 包的 socket 第一次调用 write 方法时,如果发送缓冲没问题,则 write 调用会返回写入的数据量,同时进行数据发送。但是发送出去的报文会导致对端发回 RST 报文。因为对端的 socket 已经调用了 close 进行了完全关闭,已经处于既不发送,也不接收数据的状态。所以第二次调用 write 方法时(假设在收到

2020-12-14 10:30:53 833

原创 c++ vector容器emplace_back() 和 push_back 的区别

push_back 加入元素需要先构造然后拷贝或移动,而emplace_back可以原地构造对象,然后加入到容器中,可以减少一次拷贝或构造。测试代码如下:typedef struct testEmplace { testEmplace() { std::cout << "create testEmplace" << std::endl; } testEmplace(int a) { std::cout &

2020-11-20 14:48:59 4162

原创 C++并发编程之condition_variable

<condition_variable > 头文件主要包含了与条件变量相关的类和函数。相关的类包括 std::condition_variable 和 std::condition_variable_any,还有枚举类型std::cv_status。另外还包括函数 std::notify_all_at_thread_exit()std::condition_variable::wait()std::condition_variable 提供了两种 wait() 函数。当前线程调用 wai

2020-11-04 11:15:33 472

原创 WebRTC 编译支持arm架构

WebRTC的工程通过交叉编译,可以在x86架构的linux系统上编译出支持arm架构的库。具体步骤如下:安装交叉编译工具apt-get install gcc-arm-linux-gnueabihf执行install-sysroot.py,需要翻墙#32位arm./build/linux/sysroot_scripts/install-sysroot.py --arch=arm#64位arm./build/linux/sysroot_scripts/install-sysroot

2020-10-15 10:49:53 1971

原创 ubuntu磁盘满导致无法开机

问题现象系统开机时需要部分空余磁盘空间加载服务,ubuntu磁盘占用率100%,导致启动卡死。解决方案进入recovery模式,删除无用文件,释放磁盘空间即可。进入recovery模式方法:重启Ubuntu,随即长按shift进入grub菜单;在grub菜单中,选择recovery mode,回车确认;在Recovery Menu中,选择“Root Drop to root shell prompt”,回车确认;然后输入root密码,即可进入root shell界面.VMWare虚拟机

2020-10-15 10:03:52 9858

原创 NVDEC_VideoDecoder_API_ProgGuide

概述从 NVIDIA® Fermi™ 一代开始,英伟达GPU包含一个视频解码器引擎(这本文中简称NVDEC),它提供全硬件加速解码视频的能力。NVDEC能解码许多码流格式: H.264, HEVC (H.265), VP8, VP9, MPEG-1, MPEG-2, MPEG-4 and VC-1. NVDEC运行完全独立于计算/图像引擎。英伟达提供编程NVDEC的软件API和库。这套软件API,以下称为NVDECODE API,它使开发者能访问NVDEC的解码特性,并且能让NVDEC与GPU上的其它引

2020-09-16 17:43:58 11098 7

原创 window编译ffmpeg支持NVIDIA GPU加速

官方指导文档根据官方文档一步一步操作,记录一下我遇到过的问题。Unknown option “–disable-shared”.LIEY@DESKTOP-85UH0NA MINGW64 /d/winshare/avproc/ffmpeg/ffmpeg-4.1.3$ ./configure --enable-nonfree -–disable-shared --enable-cuda-sdk --enable-libnpp –-toolchain=msvc --extra-cflags=-I../nv

2020-08-26 17:49:55 2317 4

原创 cmake报错:Could not find compiler set in environment variable RC:

问题现象使用cmake-gui生成vs工程,进行configure时,报错信息如下:CMake Error at C:/Program Files/CMake/share/cmake-3.18/Modules/CMakeDetermineRCCompiler.cmake:25 (message): Could not find compiler set in environment variable RC: C:\Program Files (x86)\Windows Kits\10\bin\

2020-08-20 17:56:07 4447

原创 C++并发编程之atomic

原子类型对象的主要特点就是从不同线程访问不会导致数据竞争(data race)。因此从不同线程访问某个原子对象是良性 (well-defined) 行为,而通常对于非原子类型而言,并发访问某个对象(如果不做任何同步操作)会导致未定义 (undifined) 行为发生。std::atomic_flagstd::atomic_flag是一个bool类型的原子变量,它有两个状态set和clear,对应着flag为true和false。std::atomic_flag使用前必须被ATOMIC_FLAG

2020-08-03 11:39:00 730

原创 C++抽象类和接口的区别

纯虚函数纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法(virtual ReturnType Function()= 0)。抽象类带有纯虚函数的类称为抽象类。抽象类是一种特殊的类,它是为了抽象和设计的目的而建立的,它处于继承层次结构的较上层。抽象类是不能定义对象的,在实际中为了强调一个类是抽象类,可将该类的构造函数说明为保护的访问控制权限。接口如果一个类里面只有纯虚函数,没有其他成员函数和数据成员,就是接口类。既然有抽象类,

2020-07-17 13:49:08 2383

原创 C++并发编程之future

不同于pthread_join可以获取线程函数的返回值,std::thread的join函数并不能获取线程函数的返回值。C++11给出的解决方案是使用std::promise和std::future.std::futurestd::future提供了一种访问异步操作结果的机制,但是我们也可以以同步等待的方式来获取结果,可以通过查询future的状态(future_status)来获取异步操作的结果。//查询future的状态std::future_status status; do {

2020-07-15 17:41:50 1577 1

原创 QtCreator使用总结

新建一个QT项目后,默认会让用户选择编译链,用户可以在新建工程时,将编译链全部勾选,一劳永逸.如果在工程设置时没有选择正确的工具链,可以在工具栏的项目选项中修改在 build & run 中点击对应的工具链即可使能,禁用已使能的工具链需右键然后选择disable工具链...

2020-07-15 10:10:04 324

原创 socket编程总结

计算机硬件有两种储存数据的方式:大端模式(big endian)和小端模式(little endian)。大端模式:高位字节在前,低位字节在后。小端模式:低位字节在前,高位字节在后。例如:0x01234567的大端字节序和小端字节序的写法如下图计算机的存储模式,与CPU设计有关,数据的顺序是由cpu决定的,如Intelx86结构采用小端模式,IBM power PC结构采用大端模式。由于这个原因不同体系结构的机器之间进行通信时要转换成一种约定的数序,也就是网络字节顺序, 网络字节顺序采用大端

2020-07-13 15:18:18 186

原创 linux手动生成core dump

什么是core dump?Coredump叫做核心转储,它是进程运行时在突然崩溃的那一刻的一个内存快照。操作系统在程序发生异常而异常在进程内部又没有被捕获的情况下,会把进程此刻内存、寄存器状态、运行堆栈等信息转储保存在一个二进制文件里。设置core dump文件大小,默认0,即不会生成core文件 ulimit -c unlimited 设置core dump文件的位置文件名格式,%e和%p会被替换成程序文件名以及进程ID。缺省情况下,内核在coredump时所产生的core文件放在与该程序相

2020-07-07 17:42:21 3481

原创 TCP流量控制,拥塞控制

TCP的流量控制RTT算法在TCP超时重传机制中,Timeout的设置对于重传非常重要:设长了,重发就慢,丢了老半天才重发,没有效率,性能差。设短了,会导致可能并没有丢就重发。于是重发的就快,会增加网络拥塞,导致更多的超时,更多的超时导致更多的重发。而且,这个超时时间在不同的网络环境下不同,必须动态设置。为此,TCP引入了RTT(Round Trip Time,环回时间):一个数据包从发出去到回来的时间。这样,发送端就大约知道正常传输需要多少时间,据此计算RTO(Retransmission

2020-06-18 16:12:06 710 1

AC3AudioESViewer_Trial.msi

AAC分析工具,

2020-09-14

反汇编工具集.zip

反汇编工具,修改动态库汇编指令

2020-08-12

x265码控使用说明.pdf

x265码控使用说明.pdf

2020-07-06

H.265视频编码标准简介.doc

H.265视频编码标准简介.doc

2020-07-06

FFmpeg命令大全文档.pdf

FFmpeg命令大全文档

2020-07-06

STUN协议RFC5389.pdf

STUN协议RFC5389

2020-07-06

RFC 3550中文文档.pdf

RFC 3550中文文档

2020-07-06

EasyICE2702.zip

HLS,TS文件格式分析工具

2020-07-06

SpecialFFLV.exe

FLV文件格式分析工具

2020-07-06

H264Visa.rar

H264码流分析工具

2020-07-06

ElecardStreamEyeTools(jb51.net).rar

ElecardStreamEyeTools(jb51.net).rar

2020-06-05

磁盘清理.zip

清理系统盘垃圾,亲测可用;清理系统盘垃圾,亲测可用;

2019-11-06

opencv-dll.zip

运行opencv程序时提示缺少的4个库文件msvcp140d.dll、concrt140d.dll、ucrtbased.dll,亲测可用

2019-09-20

OpenCV入门教程.zip

opencv入门教程,包括opencv简介,图像基本操作,读写图片,视频等

2019-09-16

MobaXterm_17527.zip

MobaXterm 专业版,nfs , FTP等功能没有时间限制,亲测可用

2019-07-19

MobaXterm.zip

MobaXterm绿色版,解压即可用,功能十分强大,支持SSH,FTP,串口,VNC,X server等功能

2019-07-19

yuvplayer.zip

查看yuv图片的小工具,可以分别查看y , u,v分量;

2019-07-08

ffmpeg基础.pdf

ffmpeg入门资料,通俗易懂,面向没有任何ffmpeg基础的读者,一共36页,带目录

2019-05-08

ffmpeg从入门到精通.pdf

ffmpeg从入门到精通电子版pdf高清带目录,刘歧、赵文杰著,链接永久有效

2019-05-08

FFMPEG FFPLAY 源码剖析_杨书良著_带目录高清.pdf

FFMPEG FFPLAY 源码剖析_杨书良著_带目录高清.pdf ,ffmpeg

2019-05-08

FFmpeg从入门到精通_刘歧;赵文杰(著)_pdf高清带目录

ffmpeg中文版,FFmpeg从入门到精通_刘歧;赵文杰(著)_pdf高清带目录

2019-05-08

Jetson TX2用户指南最新版

本文档是基于Gstreamer 1.0版本的加速解决方案的用户指南 包括在NVIDIA®Tegra®Linux驱动程序包为NVIDIA®Jetson™TX1和 NVIDIA®Jetson™TX2设备。

2019-03-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除