自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(79)
  • 资源 (2)
  • 收藏
  • 关注

原创 webrtc-candidate形成分析

webrtc

2024-09-23 09:18:32 846

原创 vs中自定义C++对象调试视图

自定义C++对象的调试视图可以自定义在vs的调试视图中如何显示一个对象的状态和信息

2023-08-10 10:24:32 331

原创 Windows下VC运行时库的部署、兼容性

Windows下VC运行时库的部署、兼容性

2023-06-06 14:30:49 3212

原创 对称型(Symmetrict)NAT打洞穿透可行性分析

此文章就对称型(Symmetrict)NAT到底是否能够穿透问题给出原理性的解释。

2023-01-31 15:56:55 5397 1

原创 服务端跨域处理原理以及处理

随着CROS标准的推广,跨域成了每个服务器开发者必须处理的问题,网上关于如何解决跨域问题的文章数不胜数,但是能用的少之又少,不少文章作者都不清楚跨域原理,不知从哪里抄来一字半句发现有效果就匆匆发表,误导了不知多少人。其实处理跨域的原理并不复杂,本文会介绍处理跨域的原理并给出python实现。

2023-01-30 10:11:01 745 1

翻译 Naming Files, Paths, and Namespaces-命名文件,路径,命名空间

Naming Files, Paths, and Namespaces译文

2022-07-26 15:01:54 599

原创 depot_tools原理和实现

depot_tools的原理和实现

2022-07-01 14:40:03 3719 1

原创 VC项目安装Nuget之后导致项目过期

VC项目安装Nuget之后导致项目过期背景有时候会突然C++项目发现安装nuget包之后,项目一直处于过期状态,哪怕代码并没有更改,调试时也会提示过期要求重新编译。分析这种明明没有任何文件更改但是项目总是过期的情况一般来说有可能有2种原因:解决方案管理器中包含了已经删除的头文件有文件的修改日期大于当前时间(通常在修改时间测试的场景下出现)首先经过检查排除了第一点,第二点涉及到的文件太多,所以先在VS的项目和解决方案的生成并运行设置中将MSBuild项目生成输出详细程度调整为诊断级别,然后开

2022-03-14 19:07:45 821

原创 GCC编译静态库的-fPIC选项

GCC编译静态库的-fPIC选项背景通常在linux下用gcc编译动态库时都会加上一个-fPIC选项来生成位置无关代码,但是从来没有人明确的说过是不是要在编译静态库时也加上-fPIC选项。我在这篇文章中就给出一个明确的结论并讲述原理。介绍-fPIC的原理的文章网上汗牛充栋这里不再赘述。原理分析众所周知,静态库其实是一系列.o文件的打包,将.o文件制作成静态库的过程是不会发生链接的。所以链接静态库就等于将静态库解包后的.o文件一个一个全部链接。-fPIC选项的生效阶段在编译阶段,使用-fPIC选

2021-11-04 17:00:45 7282 2

原创 LD_LIBRARY_PATH导致update-initramfs后找不到库的错误

LD_LIBRARY_PATH导致update-initramfs后找不到库的错误背景本文需要对linux引导启动过程有一定的了解最近在linux上要实现类似于冰点还原的功能,需要借助aufs文件操作系统来实现,而这种类型的驱动模块安装后要重新制作initramfs引导。所以需要在程序中自动的修改系统引导。但是在开发的过程中发现如果使用自己的程序调用脚本修改系统引导会导致系统无法启动,引导阶段提示systemd-udev在启动的时候找不到libcrypto.so。而如果直接在shell里调用脚本,不

2020-06-19 10:18:23 778

原创 windows electron-4.0.5编译指南

windows electron-4.0.5编译指南前言最近项目中用到electron,但是electron占用磁盘空间太大,所以想对electron做一波精简,但是做精简的前提是自己编译electron。发现网上能找到的相关文章基本过时,官方编译指南对于没有掌握一定的google系构建系统知识的人来说过于简单。所以将我在此次编译过程中遇到的问题与过程记录下来,希望能对有需要的人提供帮助...

2019-05-19 20:44:17 3067 2

原创 使用cmake安装nuget

使用cmake安装nuget目前在vs上c++项目对第三方库的引用通过nuge来引用。但是一些跨平台项目使用cmake构建,cmake生成脚本中没有提供nuget的支持。使用nuget本质就是导入了一个从服务器上下载的targets文件,cmake3.8支持了向项目中添加targets文件。所以可以借助这一特性间接的使得cmake脚本支持nuget。本文章所述内容必须要使用cmake3

2018-01-31 16:58:26 2143

原创 python中正确显示windows系统上其他进程的输出

python中正确显示windows系统上其他进程的输出现象 try: subprocess.check_output(cmd_list) except subprocess.CalledProcessError as e: error = e.output.decode() print("erro

2017-11-25 11:37:45 931

原创 TCP新手误区--数据校验的意义

TCP新手误区–数据校验的意义背景最近面试了很多的学生,发现很多TCP的新手对于TCP的使用有一些误区,而这些坑也是当初我曾经疑惑过得地方。网上很少有文章对这些问题有过详细的解析,即是有也只是直接给出结论和做法,没有人将其中的来龙去脉讲解清楚,所以我将这些问题的来龙去脉在这一系列的文章中讲述出来,希望能让广大TCP的新手避开这些坑。问题我面试时经常会问的一个问题是TCP如何保证数据的正确性,保证数据

2017-07-15 23:00:11 9518 6

原创 使用libmp3lame库编码mp3

lame是一个有名的开源mp3编码库,但是目前网上使用lame库的教程基本都是直接贴一篇代码,没有任何的解释,而每个使用者需要编码的需求都不一样,这些所谓的教程基本没什么作用。这篇文章将会介绍如何调用lame库的接口编码出mp3。不同于目前网上的大多数lame教程,本文不会干巴巴的贴一屏幕代码,而是尽量对lame库提供的各种参数设置的接口做讲解。让读者能够举一反三,根据自己的需求编码出各种格式的mp3。

2017-06-18 17:26:55 20566 1

原创 TCP新手误区--粘包的处理

TCP新手误区–粘包的处理背景最近面试了很多的学生,发现很多TCP的新手对于TCP的使用有一些误区,而这些坑也是当初我曾经疑惑过得地方。网上很少有文章对这些问题有过详细的解析,即是有也只是直接给出结论和做法,没有人将其中的来龙去脉讲解清楚,所以我将这些问题的来龙去脉在这一系列的文章中讲述出来,希望能让广大TCP的新手避开这些坑。问题我面试时经常会问的一个问题是当TCP两端A、B建立了连接后,A端先发

2017-06-16 21:45:47 11202 17

原创 TCP新手误区--心跳的意义

TCP新手误区–心跳的意义背景最近面试了很多的学生,发现很多TCP的新手对于TCP的使用有一些误区,而这些坑也是当初我曾经疑惑过得地方。网上很少有文章对这些问题有过详细的解析,即是有也只是直接给出结论和做法,没有人将其中的来龙去脉讲解清楚,所以我将这些问题的来龙去脉在这一系列的文章中讲述出来,希望能让广大TCP的新手避开这些坑。问题我面试时经常会问的一个问题是当TCP两端A、B建立了连接后,如果一端

2017-05-01 23:56:49 13320 8

原创 使用ffmpeg、x264库强制编出关键帧(I帧)

使用ffmpeg、x264库强制编出关键帧(I帧)背景当h264数据在使用udp传输时,丢包是一件很常见的事情,当接收端丢包发生后,应该通知发送端,让发送端立刻重新发送一个关键帧。此时就需要编码器无视关键帧间隔立刻编出一个关键帧。那么怎么让编码器立刻编出关键帧呢?接下来就列举常用的两种编码器ffmpeg、x264重编出关键帧的方法。编码库的使用方法在网上有很多文章。本文假设读者已经了解编码库的使用,

2017-05-01 00:53:43 10512 1

原创 shell之export难点解析

shell之export难点解析shell中的export的作用是将脚本中的变量导出,使得变量在此脚本之外也能起作用。 export的使用中有一些难点和容易理解错误的地方,在此特别记录下来。生效时机在脚本A中export变量后要注意的是导出的变量并不会在脚本A执行完后在执行脚本A的shell中生效,而是会在脚本A中启动的其他的脚本后在其他的脚本中生效。注意:脚本A里export了一个变量V,那么只

2017-04-29 13:20:57 1172 1

原创 shell中的几种少见的变量继承(传递)方式

shell中的几种少见的变量继承(传递)方式背景众所周知,父shell中的临时变量是不能被子shell继承的。要想继承只能在父shell中将变量使用export导出,变为环境变量。 但是这几天研究一些著名开源项目中的configure脚本,发现了一些不同寻常的方式可以让子shell继承父shell中的变量而不用export导出。使用小括号传递变量AA=aa(echo ${AA})按理说小括号里的

2017-04-29 13:10:55 3109

原创 调试托管程序中加载的本机dll

调试托管程序中加载的本机dll背景最近和c#的同事一起开发一个程序,我用c++开发sdk的dll,主程序使用c#开发。但是在调试过程中遇到了一些问题,vs附加c#程序后无法调试c++代码。现象在程序运行的过程中,sdk出现了一些问题,我需要调试c++代码。当我使用vs附加到运行的进程后发现c++dll的符号并没有被加载,断点无法生效。而且我确定pdb文件已经和dll文件放在一起,不可能是找不到pdb

2017-04-23 21:37:17 1000

原创 ortp数据收发调度器源码分析

ortp数据收发调度器源码分析rtp在传输中需要定时的去收发数据,ortp库中提供了这种调度器机制,这篇文章主要着眼于ortp的调度器的代码进行分析。架构ortp的调度器分三个部分。 - 第一个部分在每个rtpsession中,有一个WaitPoint结构体,其中有估算的下一次接收或发送的时间,唤醒用的条件变量和一个唤醒标识。 - 第二个部分是一个全局的调度器,这个调度器是ortp库全局唯一的,

2017-02-22 18:51:47 2411

原创 ortp定时器源码分析

ortp定时器源码分析ortp中的定时器模块仅仅在数据收发的调度器中有被使用,所以非常简单。由于要跨平台所以定时器的代码实现都是调用了各个平台上的原生定时器接口。本文主要基于windows平台实现进行分析。架构定时器是一个结构体,结构体中含有初始化,等待超时,销毁三个函数指针,使用的时候通过调用这几个函数来使用。还有一个周期成员但是其实并没有任何作用,真正的周期已经写死在代码里无法修改。结构体Rtp

2017-02-22 18:35:56 1001

原创 ortp事件处理源码分析

ortp事件处理源码阅读笔记结构ortp是使用c语言编写的一个库,里面的数据结构都是以c语言的形式写成的,都是有struct作为存储结构,一些专用的操作函数作为方法。这篇文章专注于其中的事件处理代码。mblk_ttypedef struct msgb{ struct msgb *b_prev; struct msgb *b_next; struct msgb *b_con

2017-02-13 09:53:22 1863

原创 windows下判断网卡是否是虚拟网卡的方式

windows下判断网卡是否是虚拟网卡的方式网上流传的判断虚拟网卡的方式通常是判断网卡名称,以PCI开头的网卡都是真实网卡。因为以前网卡都是PCI网卡,不是的就是虚拟网卡。但是这种方式不一定全部正确,因为现在有些网卡不是PCI网卡,例如USB网卡,但是它依然是真实网卡。所以这种方法就不在可靠了。 最可靠的方法是读取注册表来判断,是我目前发现的最可靠的方法。 首先要知道网卡的名字,可以通过GetA

2017-02-04 19:05:34 6460 1

原创 在windows上创建完美的不规则窗口

在windows上创建完美的不规则窗口不规则窗口方法简介windows上的窗口绝大多数是方形的,但是偶尔也会有一些其他形状的窗口,如圆形甚至不规则形状。这些不常见的窗口是如何做出来的呢? 有两种方法可以创建不规则窗口 1、windows在很早的时代就支持不规则形状的窗口了。windows提供了SetWindowRgn 函数来设置窗口的区域,还提供了一些函数来创建椭圆、圆角矩形区域,还可以自己绘制

2017-02-04 19:01:03 4476

原创 使用vc++创建windows透明窗口

使用vc++创建windows透明窗口windows下的透明窗口有不少的实现方法,最简单的当属空画刷啦,但是这篇文章将的是用layer window(分层窗口)来实现透明窗口。 见过vista/win7中窗口漂亮的半透明特效吗?用layer window可以轻松实现,而且其实layer window在古老的windows2000中就已经实现啦。基本不用考虑平台的问题。layer window其实就

2017-02-04 18:53:13 7260

原创 STM_SETIMAGE引起的gdi内存泄露

STM_SETIMAGE引起的gdi内存泄露最近给程序加了一个动画功能后,发现程序会引起及其严重的内存泄露,找了半天发现是调用STM_SETIMAGE引起的。素以在此将使用STM_SETIMAGE遇到的问题记录一下。 我的程序将动画的所有帧提前加载后用定时器循环用STM_SETIMAGE把位图句柄发送到窗口显示,发现没显示一次就泄露好几M内存,而且动画切换的速度是很快的,所以不一会就开始bad_a

2017-02-04 18:48:20 892

原创 gdi+的画图抗锯齿原理

gdi+的画图抗锯齿原理最近解决以前的一个问题时需要画一个没有锯齿的椭圆区域来,以前的版本画的椭圆被客户投诉锯齿太明显,我一看锯齿确实明显,如果放在大平板这种dpi比较低的屏幕上那就更明显了。 听说gdi+能够抗锯齿,然后就用了一下,画出来的椭圆果然没有了锯齿。本以为事情就这样顺利的结束了,结果出现了意外。我用gdi+画出来的圆边缘非常光滑,但是最后生成的的椭圆区域却依然锯齿满满。 最后将gdi

2017-02-04 18:44:22 4972

原创 qtmain.lib 分析

qtmain.lib 分析本文所使用的qt版本为5.7.0,编译器为vs2013背景在vc下使用qt的库时候,会发现有一个qtmain.lib的静态库,其他的qt库都是以动态库的形式提供的,只有这个是以静态库提供的,并且发现只有windows下的库会有这个,linux的库里并没有相应的库。 那么这个库是必须使用的吗。在使用时会发现,有时候不链接这个库就会造成链接失败,但是有时候不链接这个库也没什么

2017-02-04 16:31:54 4066

原创 qt5.7.0源码编译手记

qt5.7.0源码编译手记最近要打包qt的库,所以需要编译qt源码。在qt的编译中遇到了不少的问题,都是在其他开源项目的编译中没有遇到的。而且qt源码自身的编译文档写的也比较烂,讲的不清不楚。废了不少功夫。 由于只需要qt的基本功能的库,所以并没有编译qt的全部组件,只编译了一部分。 本文的编译都是在windows上使用vs2013进行的编译。准备工作首先下载qt源码,我下的是qt-everyw

2017-01-04 11:05:21 4481

原创 openh264限制slice/nal分片大小导致的编码数据错误

openh264限制slice/nal分片大小导致的编码数据错误最近在使用openh264进行编码的时候发现,一旦限制了slice/nal分片的大小,编码输出的数据就会出现错误。最后确定这个是openh264的bug。这里讲一下这个问题的原因和规避方法。 本文所述的openh264皆是指1.6版本复现步骤经过多次试验、对比后发现,只有当启用了CABAC然后限制slice/nal分片的大小小于一定的

2016-12-05 20:23:31 2763

原创 Disruptor c++使用指南

Disruptor c++使用指南简介Disruptor是一个线程间通信的框架,即在多线程间共享数据。它是由LMAX公司开发的可信消息传递架构的一部分,以便用非常快速的方法来在多组件之间传递数据。 Disruptor最初是在JAVA上被发明的,这里讨论的是它的c++实现版本的使用方式,但是原理和JAVA版本是一致的。实现思路Disruptor的实现思路就是每一个数据都会有一个唯一自增的序号,用一个

2016-11-08 17:17:47 6227 2

原创 openh264使用指南

openh264使用指南概述目前openh264官网只有一些问答,关键的开发资料全在github页的的wiki页面(https://github.com/cisco/openh264/wiki)同样官方的二进制库也在github页的release页面上提供下载(https://github.com/cisco/openh264/releases)此文章所述皆为windows平台,其他平台使用类似。此

2016-10-25 10:07:54 17632 7

原创 使用subtree引入子项目

使用subtree引入子项目建立子仓库关系首先添加一个远程仓库 git remote add -f <子仓库名> <子仓库地址> 这一步并不是必须的,只是为了以后的方便更新。 然后将上一步的远程仓库和当前仓库的某个目录链接起来 git subtree add --prefix=<子目录名> <子仓库名> <分支> --squash prefix后的子目录名指的是子仓库将被放到主仓库下的哪个

2016-10-24 10:01:15 633

原创 图像处理、显示中的行宽(linesize)、步长(stride)、间距(pitch)

图像处理、显示中的行宽(linesize)、步长(stride)、间距(pitch)在图像数据传输和显示的过程中有一个不常用的参数:间距。间距的名称:它有很多的别名,在使用d3d显示的时候,它叫pitch;在用ffmpeg解码的时候,它叫linesize; 在用ffmpeg转换格式的时候,它叫stride。这篇文章中统一以间距来表示。间距为什么出现:这个参数看起来似乎没什么用,因为它的值和图像的宽

2016-09-28 15:08:59 12533 2

原创 减小NSIS安装包体积的方法

在NSIS脚本的开头加入 SetCompressor /SOLID LZMA 可以使得安装包的体积缩小,通常能缩小20%左右。 这句脚本的含义是使用固实压缩,对于多个文件的压缩能够缩小压缩后的体积。尤其对于多个文件更加有效。 固实压缩文件是一种特殊压缩方式存储的压缩文件,它把压缩文件中的全部文件都当成一个连续数据流来看待。 固实压缩可增加压缩性能,特别是在添加大量的小文件的时候,但它也有一

2016-09-07 18:09:02 3170

原创 在gcc中的使用调试版c++运行库

在gcc中的使用调试版c++运行库背景vc中的debug和release版很大的一个区别就是他们会分别链接debug和release版的c/c++运行库,而且之间相互不能混用。debug版的c++运行库能够对一些无效迭代器、越界等行为提供检查,提前在debug版发现问题。 这么想来在linux下gcc应该也有相同的功能,但是平时在使用gcc编译程序时好像并没有什么选项能够链接debug版的c++运

2016-09-06 20:07:09 2024

原创 pyinstaller安装指南

pyinstaller安装指南因为各平台方法有所差异,所以我们使用源码安装。 首先去官网下载代码包。 我现在的最新版是3.2,链接:https://github.com/pyinstaller/pyinstaller/releases/download/v3.2/PyInstaller-3.2.zip,下载后解压。 然后确保你已经安装了python。 因为pyinstaller用到了pywin

2016-09-02 12:10:25 4320 1

原创 VC静态库的调试

VC静态库的调试背景对于动态库或者可执行程序而言,如果想要调试只要将对应的pdb文件和动态库或者可执行文件放在一起即可自动加载符号。 众所周知静态库在最终链接的时候是把代码直接链接到最终的生成文件里的。这就决定了不可能把静态库的pdb文件和生成文件放在一起来调试。所以我们想要调试静态库,肯定需要一些特殊的操作。 那么,对于静态库调试,具体该怎么做呢?静态库的pdb文件首先我们确定一件事,静态库有

2016-09-02 01:26:18 6123

马克飞象windows安装包

本来作者是放在百度云上的,但是垃圾百度非要下载客户端,所以放在这里

2017-06-28

基于vfw技术的摄像头监控软件

基于vfw技术的摄像头监控软件,能通过电脑支持vfw的摄像头进行录像并保存以监控。能自由选择录像保存路径和单次录像时间。

2013-09-29

空空如也

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

TA关注的人

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