自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(112)
  • 资源 (4)
  • 收藏
  • 关注

原创 C/C++程序编译与链接(一) 编译与链接的概念

编译器本质上是将源代码中的高级语言翻译成低级语言,比如翻译成intel x86平台的汇编代码。上面简单的描述编译器的主要工作后,可以体会到编译器的复杂性,通常一个大型的C/C++项目有成千上万上个源文件,源文件间的调用关系错中复杂,编译器生成正确的汇编代码,要理解这些调用关系产生正确符号地址等,再生成正确的执行文件,还要讲究速度。这样简单的想想都很复杂。平常我们认为C/C++复杂,认为它们是比较低级的语言,但是在它们背后,编译器还是做了大量的工作。那么对python,java这样简洁,高效的语言。

2023-02-27 09:52:28 2782

原创 手把手教你实现buffer(四)——webrtc中的CopyOnWriteBuffer

的实现基于Buffer,在功能上强于Buffer。我们也可以根据业务的需求,基于Buffer封装自己的Buffer类。

2022-11-02 10:07:50 735

原创 手把手教你实现buffer(三)——接口及自动扩容

但是buffer还是有特定的使用场景,也需要一些基本的,通用的,易用的接口。的中内容,就需要提供这样的接口,所以使用时一点要注意不要破坏内存,比如写了大于容量的数据量等。定义在buffer.h文件中,在前一篇文章已经贴出,下面是buffer.cpp的代码。内容管理机制的接口,可以直接往内存中读写数据,权限太大。写入数据时,如果当前的容量不够,则会再次分配内存,扩大容量。重载了两种不同形式的下标操作符,前面一个是返回。位置的引用,可以直接更改数据。内部内存的地址,并且可以直接读写数据。指针,只可读,不可写。.

2022-08-08 09:33:24 1239

原创 手把手教你实现buffer(二)——内存管理及移动语义

禁止拷贝,通过是构造函数,复制构造函数,赋值操作符号来实现。类,它是一个非常典型的基础buffer封装,我们来通过分析它的实现,来学习要如何实现一个buffer。多引用几次,引用关系就会混乱了,很容易造成问题,比如内存无法释放;在C++中最直观的语义就是引用语义,因为它代表一块内存空间。但是这种引用语义,很难区分所有权,即是谁需要对这块内存负责(负责分配,负责释放),这种语义的。移动赋值运算符的逻辑跟移动构造函数的相同,将资源转移,将原对象置为无效。给到了所构造的对象,而原对象的。时,内存会自动释放。...

2022-08-01 18:57:19 1324

原创 手把手教你实现buffer(一) —— C++中buffer的概念及需求

buffer的概念很庞大,根据不同场景,有各种各样功能的buffer,比如双缓冲buffer,jitterbuffer。这篇文章说的buffer,是指一段用于存取数据的内存空间,这是最基础的buffer。然而就是这种最基础的buffer,在C++中标准库也没有提供很通用,完善的buffer类(-_-!)。这一系列文章,将参照webrtc中的,一步步介绍如何实现这样的buffer。......

2022-08-01 18:55:15 9821

原创 将自定义类型作为关联容器的key

如下一个结构体structS{intn;boolf;floatd;};作为关联容器的key,需要定义operator

2022-07-26 10:12:52 243

原创 webrtc中的视频编码(一) 视频编码模块轮廓

关于webrtc视频编码的分析,这将是一系列文章,主要从代码结构和设计思路两个方面去分析视频编码模块,不会进入代码细节,目的是在自己实现视频编码时可以从中借鉴。这篇文章是这个系列的第一篇,主要是介绍视频编码模块轮廓。整个视频编码功能包括下面几个功能类:视频编码接口类,是一个抽象接口类。它有多个实例,编码h264 encoder,vp8/9 encoder工厂类,用于创建的具体实例 h264编码接口类,有个方法用于创建h264的编码类实例(好绕-_-!) h264编码的具体实现,的实例包括,, 它们之间的关系

2022-07-08 11:54:45 2709

原创 webrtc中的任务队列TaskQueue

webrtc中的任务队列TaskQueue代码分析

2022-07-04 17:46:14 1026

原创 程序员的财富观

对财富知足些,财富自由是能不能的问题,人生幸福是想不想的问题

2022-03-02 09:52:47 2067

原创 大龄程序员的心理建设

我的IT职业生涯从2010到2021年,已经11年,换了三家公司。现在在第四家公司待了将近两年。我已经36岁了,按照程序员35岁定理,我在职场上是没竞争力了。在年龄上35岁是青中年,正式人生的巅峰期,但是在程序员的职业年龄上,已步入“晚年”。后面的几十年的职业路,我该怎么走?年龄越大在职场上就越不受欢迎,除非你是公认的牛人。可能三十五岁的程序员百分之九十都自认为是人才(包括我),但是其实很少符合“公认”的标准。你是某个著名开源库的作者,你参与了某个非常著名产品设计研发,你是教授,你发了重要的论文,这些都是

2022-02-24 08:21:50 334

原创 webrtc中视频采集实现分析(一) 采集及图像处理接口封装

文章目录webrtc中视频采集类DeviceInfoGetBestMatchedCapabilityVideoCaptureModuleVideoCaptureFactory示例视频帧处理I420Buffer视频采集是媒体库最基础功能。但是它的实现与操作系统有强相关性,因为不同的操作系统提供的视频采集接口不一样。视频采集模块也具有通用性,不同媒体库的视频采集模块实现的功能是相同的,主要包括如下几个功能:检索视频采集设备指定视频采集设备进行采集根据指定的采集参数(包括分辨率,帧率,图像格式)来初始化

2022-02-08 11:52:10 4169 1

原创 webrtc中视频采集实现分析(二) 视频帧的分发

视频采集模块,抛出视频数据后,对视频帧的处理需求一般包括如下几种:视频帧送到编码模块进行编码视频帧送到渲染模块进行本地回显视频帧先进行预处理(比如添加水印,字幕),再送去回显或编码视频帧会送到多个编码器,产生多路不同分辨率,码率的码流所以从采集模块获取的视频帧是需要分发的,也是只有一个source,但是有多个sinkwebrtc中的实现webrtc中有一个对视频帧的分发框架,可以直接借用相关实现videoSourceInterface作为source的基类主要接口是 AddOrU

2022-01-13 16:07:48 3171

原创 webtrc 中VideoAdapter类中的作用及局限

需求在媒体库中,是要求能动态改变编码的分辨率和帧率的,思路是重启编码器,设置编码器新的分辨率,帧率参数来满足要求。所以输入到编码器中的视频流分辨率,帧率应该与设置的分辨率参数是一致的。但是不能通过改变视频采集的分辨率来实现,否则可能会造成摄像头重启,导致图像会黑一下。往往是在送入编码器之前应该有专门进行分辨率,码率适配的功能类。输入的是视频采集的原始分辨率和帧率,输出的是满足于编码器的编码分辨率和帧率。VideoAdapter类分辨率的适配webrtc中VideoAdapter类就是实现这里的功能

2022-01-11 15:13:16 1421

原创 webrtc中的引用计框架

webrtc中的引用计框架文章目录webrtc中的引用计框架基本框架类scoped_refptr实现用法使用示例基本框架类webrtc中通过RefCounter,RefCountedObject,RefCountInterface类提供了一个引用计数框架。RefCounter是计数器类,实现了线程安全的计数功能;RefCountedObject对RefCounter进行了封装;RefCountInterface是接口类,要求实现AddRef()和Release()接口。它们可以单独使用,可以结合使用。

2022-01-10 19:15:03 809

原创 C++ 11中的移动语义

移动语义文章目录移动语义拷贝与移动拷贝移动左值与右值左值引用和右值引用移动语义移动构造函数和移动赋值函数移动对象后为可析构状态编译器生成移动操作移动操作的匹配std::move函数STL中的移动语义拷贝与移动一个形象的比喻如何把一个冰箱里的大象放到另一个冰箱中?打开冰箱1的门,打开冰箱2的门,将冰箱1里的大象移动冰箱2中,关上冰箱门。这是一个很自然的方法,那么还有一种方法,将冰箱2里的大象复制一头,将复制的大象放到冰箱1中,再让冰箱2里的大象消失掉。这种方法是不是感觉似曾相识,这个就是C ++

2021-09-15 10:06:54 551

原创 多个gcc/glibc版本的共存及指定gcc版本的编译

文章目录需求背景知识什么是glibc,libc,glib依赖关系方法查看glibc版本查找glibc库的位置查看glibc API的版本libstdc++查找```libstdc++.so```的位置查看```libstdc++```的版本查看系统```libstdc++```API的版本libstdc++,glibc的关系确定程序需要的```glibc/libstdc++```的版本解决步骤编译安装多个gcc/glibc版本共存指定gcc/g++,glibc的版本进行编译程序运行机器上的依赖总结这篇文章

2021-08-21 12:00:50 46342 2

原创 使用C++ 11 chrono库处理时间

跨平台时间处理对于时间处理的需求获取当前时间,比如记录日志,精度一般到毫秒计算时间间隔,比如判断代码块的运行时长获取日期,日期换算定时器OS提供的API时间日期相关time_t time() //返回从1970-01-01 00:00:00 +0000 (UTC)的秒数(C语言标准库提供)int gettimeofday(struct timeval *tv, struct timezone *tz); //返回指定时区 回从1970-01-01 00:00:00 +0000 (

2021-08-21 10:04:20 5397 1

原创 C++ 11多线程编程(三)--生产者消费者队列及实现

文章目录生产者消费者队列用途划分:容量划分:实现有界队列无界队列生产者消费者队列它是实现线程间协作,交互一种重要手段。从一端放数据,从另一端取数据。放入数据的线程称为生产者,取出数据的线程称为消费者。生产者和消费者可以有一个或多个。生产者,消费者线程间通过条件变量来实现协作对队列的访问需要加锁互斥用途划分:根据队列的用途来划分为两大类数据分发队列中存放的业务数据。分别有一个或多个生产者,消费者线程。生产者线程产生不同类型的数据,通过队列分发给不同消费者线程任务队列队列

2021-08-05 09:41:15 5811 1

原创 C++ 11 多线程编程(二)--更高层次的抽象

文章目录线程协作的更高层次的抽象std::futurestd::promise用法建立”通道“使用“通道”协作流程图代码示例std::packaged_taskstd::future与std::shared_futurestd::future 与 std::promise还有更高层次的抽象```std::async```小结线程协作的更高层次的抽象std::thread库对OS 线程系列API的封装,可以非常方便地使用线程,互斥量,条件变量。但是直接使用std::thread库中的互斥量,条件变量来实现

2021-07-14 09:57:01 378 1

原创 C++ 11 多线程编程(一)

文章目录基本概念多线程编程的层次线程库STL中thread库线程的创建线程的生命周期线程对象不支持复制和赋值,只支持移动语义将线程移动到容器中线程间的通信临界区互斥量条件变量错过信号及假醒条件变量的使用规则基本概念并发:让实际可能串行发生的事情好像同时发生一样。并行:并发序列同时执行,真正的并行只能在多核系统中存在。并行要求程序能够同时执行多个操作,而并发只要求程序能够假装同时执行多个操作((在单核下,通过os的调度实现并发,多核下会分配到不同的核去处理))用一个典型的例子来说明并发与并行:1

2021-07-03 11:21:37 696 6

原创 lambda函数用法总结

概念lambda函数是C++ 11引入的新特性,在其它语言中也有lambda,典型的如javascript。它是函数编程的基础。在C++中,lambda表示匿名函数,特点是就地定义就地使用,它是一种语法糖,编译器会将它翻译成函数对象。所以它并不是一个"黑科技"。C ++ 11引入lambda表达式的目的就是要就地书写,就地使用,提供一种简化代码的手段。所以咱们主要是了解它的使用。基础用法语法捕捉列表+参数列+函数体1.[ 捕获 ] ( 形参 ) -> ret { 函数体 }2.[ 捕获

2021-05-28 10:15:09 3101

原创 bind和function

文章目录概述可调用对象可调用对象的类型调用形式function的用法bind的用法function与bind结合新的回调实现机制面向对象的思想通过回调实现概述bind和function是C ++ 11引入的非常重要的两个语言特性,通过它们C++也可以很方便的实现类似C#的中委托,从而提供了一种新的回调实现机制。先看下它们的用法。可调用对象在C++中函数,函数指针,指向类的成员函数指针,函数对象(重载了调用运算符的类),lambda函数int func(int a,int b){ r

2021-05-15 10:37:47 1354 2

原创 再识关联容器

关联容器包括set,multiset,map,mulitmap,它们的实现通常是平衡二叉树。下面是记录关联容器的一些使用细节。特有查找接口根据关联容器的实现的数据结构平衡二叉树。它们提供了查找接口。名称作用find(elem)返回“元素为elem“的一个元素,如果找不到就返回end()lower_bound(elem)返回elem的第一个可安插位置,也就是“元素值>=elem“的第一个元素位置upper_bound(elem)返回elem的最后一个可安插位置

2021-05-04 21:09:12 162

原创 浅述webrtc中的ICE流程

背景webrtc的提供的音视频解决方面是针对P2P的,在实际的运用的中往往有诸多限制。在很多场景中会有一个webrtc接入服务来实现对web的接入,实现与具体的音视频业务的转换。web 互通的基本流程上图是web对通的基本流程,图中描述的是两个web进行点对点互通。涉及到角色有信令服务,STUN,TURN服务。STUN/TURN+NAT穿越流程即代表了ICE流程webrtc接入服务web与接入服务的互通,跟上图的流程差别不大。只是web与接入服务在ICE中所扮演的角色不同,本篇文章将介绍ICE的基

2021-04-26 10:42:26 4648

原创 走读webrtc 中的视频JitterBuffer(二)

VCMDecodingStateVCMDecodingState 是用于判断nalu是否可以连续解码,判断的依据因不同编码格式而不同。它支持了三种编码格式:VP8,VP9,H264,看下它定义的几个成员变量uint16_t sequence_num_;uint32_t time_stamp_;int picture_id_;int temporal_id_;int tl0_pic_id_;bool full_sync_; // Sync flag when temporal layers a

2020-10-09 11:17:28 563

原创 走读Webrtc 中的视频JitterBuffer(一)

基本概念在实时流媒体系统中,jitterbuffer是在解码端,起到如下几个作用:对rtp包进行排序对rtp包进行去重去抖动对于1,2点比较简单。核心的是去抖动,去抖动实现的目标就是使视频能平滑播放,不因为抖动忽快忽慢。简单的视频jitterbuffer可以只针对rtp包进行处理,只对rtp进行排序,去重。并不处理视频帧。如下图这种简单的实现并不关心视频帧是否有错,是否可以解码。视频帧间是否可以持续解码。(针对视频帧内的RTP包,如果经过排序和去重,可以认为是可解码的)。这些全部放在解码

2020-10-09 11:14:04 1587

原创 使用PortAudio检索设备

背景在项目中,有个定制的银河麒麟x86系统,我们的终端软件放上去后,总是采集不到音频,经定位发现,系统中有多个音频设备,但是默认的选用的音频设备采集不到声音,但选择一个USB的音频采集设备就可以采集到声音。而我们的终端软件又没有提供音频采集,回放设备的选择功能。所以需要加入这个功能,终端软件需要跨平台,兼容windows与linux实在是比较繁琐。所以直接选用了PortAudio库,来屏蔽这些细节,将这些烦人的细节丢给PortAudio库去解决吧。PortAudio is a free, cross

2020-07-13 19:14:28 2139

原创 通过libfdk-aac的使用来看音频参数配置的策略

灵活性背景在一些实时音视频系统中,终端软件通常可以设置音频编码参数,如采样率,通道数,码率等。开放编码参数可配,增加了灵活性,但是在实现增加了复杂度。特别是某些编码格式,如果考虑到音频的采集,回放,实时性。这里针对AAC的编解码库libfdk-aac来说说参数可配的限制。libfdk-aac不同AAC规格的差异性不通规格AAC编码输入帧的长度要求不一样,如下所示:AACENC_GRANULE_LENGTH = 0x0105, /*!< Core encoder (AAC) a

2020-06-05 10:55:48 2603 4

原创 说说C++中的POD

背景POD的全称是Plain Old Data,这个Old就是体现了C语言的兼容。POD数据类型就是兼容性很重要的体现,特别是对用户自定义的类型(struct,class定义的类)。因为标准要求POD类型的内存布局是完全与C语言。原理C++是C的超集,加入了更多语法层面的新机制,编译器充当了一个翻译的角色struct POD{ int v; int a;};struct NotPOD{ public: NotPOD(){}

2020-05-22 16:16:30 1320

原创 RTP RR及SR包中NTP的转换

背景在RTCP的RR及SR中report block存在一个ntp字段,这个值为RR或SR产生时间戳。RFC3550的第4节描述了它的意义Wallclock time (absolute date and time) is represented using thetimestamp format of the Network Time Protocol (NTP), which is i...

2020-03-09 16:34:07 1696

原创 libfdk-aac编解码代码示例

背景前面几篇文章介绍了AAC的几种封装标准及libfdk-aac的一些使用细节,这篇文章就给出libfdk-aac编解码代码示例。示例编码编码封装类CAACEncoder适用于RTP流媒体应用,设置的AAC编码规格为AAC-LD,封装格式为LATM,设置编码输入的采样点数为480(适用于采样率为48000),包复用个数为2(适用于采样周期为20ms)编码接口 int EncodeFram...

2020-03-06 18:57:04 4696 9

原创 使用libfdk-aac编码所需注意的细节

背景libfdk-aac源码中提供了一个编码的示例程序,文件为aac-enc.c,演示了编码API基本的调用流程,流程也比较简单,看看示例代码就明白了。这里要讲的是应用在rtp流媒体时,所需注意的细节。细节封装格式的选择typedef enum { TT_UNKNOWN = -1, /**< Unknown format. */ TT_MP4_RAW =...

2020-01-20 16:58:47 4996 11

原创 编译libfdk-aac

经验的误区fdk-aac项目中并没有直接提供vs下的编译工程,也没有CmakeList 脚本。所以我凭经验判断,源码是需要在mingw环境下编译。正是这种直观,简单的判断,直接在编译上挖了个坑。我用mingw很顺利编译出了libfdk-aac.a库,结果在链接到执行程序时出错了,错误如下:(fft.o) : fatal error LNK1143: 无效或损坏的文件: 没有 COMDAT 0...

2020-01-20 11:35:19 2167 6

原创 RFC6416中对AAC进行RTP打包方式介绍

简介rfc6416是描述如何将MPEG-4 Audio/Visual Stream封包至RTP中的。文档写的还是比较清晰简明的,对音频而言,没有再定义额外的码流结构,就是直接对MPEG-4 Audio stream的结构进行打包。下面列出的是需要理解的概念:MPEG-4 Audio/Visual Stream是在ISO/IEC 14496-3,ISO/IEC 14496-2中定义,分别用于...

2020-01-12 11:04:49 1773

原创 RFC3640中对AAC进行RTP打包方式介绍

总括RFC3640和RFC6416定义了两种对MPEG-4 Stream的RTP封包方式。这里只介绍对音频码流(即AAC)的封装方式。先从RFC3640开始。如果有RTP打包音视频码流的开发经验,下面的一些知识点,理解起来会简单些。RFC 3640中定义了对MPEG-4 Elementary stream(包括audio,video,mpeg4 system)通过RTP封包的方式。下面所列的是...

2020-01-06 20:19:27 3907 2

原创 AAC及其封装格式

背景最近在媒体库中需要加AAC,要求能与华为的一个IP语音电话型号,通过AAC对通。这个需求的功能并不复杂,而难在对于AAC的封装格式标准及对于AAC编解码库的使用,需要有一个系统性的认识。AAC标准光编码规格就有好几种,并且针对不同的场景衍生出的封装格式也有好几种。应用到流媒体,rfc也有几个。所以是细节特别多。很容易走错方向。做个总结,这将是一系列文章,先介绍AAC封装标准,RTP封包标准...

2020-01-06 19:46:29 5283

原创 说一说asio中两个需要注意的错误码

背景在我们的媒体库中使用基于asio封装一套IO模块,主要功能是媒体流的收发及转发。我们的系统使用的RTP协议作为流媒体协议,所以传输层协议是基于udp协议。问题1在sip信令协商成功后,开始流媒体收发时,偶现在异步收接口中一直报10061错误码,对应的错误码描述是连接被拒绝出现这个错误,感觉很奇怪,媒体流的收发都是基于udp的,为什么会报连接被拒绝,又不是基于tcp的。检视代码未发现逻辑...

2019-09-19 20:32:45 1278

原创 彻底弄懂I420格式

YUV的概念YUV 和我们熟知的 RGB 类似,是一种颜色编码格式。它主要用于电视系统和模拟视频邻域(如 Camera 系统)。YUV 包含三个分量,其中 Y 表示明亮度(Luminance 或 Luma),也就是灰度值。而 U 和 V 则表示色度(Chrominance 或 Chroma),作用是描述图像色彩及饱和度,用于指定像素的颜色。没有 UV 分量信息,一样可以显示完整的图像,只不过是...

2019-08-18 18:12:56 7291 1

原创 你了解linxu下的线程id吗?

背景最近在实现一个日志库时,需要记录线程id,我采用C++ 11中的std::thread api获取,如下例子代码:#include <thread>#include <iostream>int main(){ std::thread::id tid = std::this_thread::get_id(); std::cout <&lt...

2019-08-13 11:10:34 510

原创 掌握几种linux工具让程序更稳定

总结几种linux下观察程序使用资源情况的工具,包括:CPU,内存,fd有无泄漏,IO有无异常(比如日志异常输出),网络IO有无异常。通过这几种工具监控程序运行时资源有无异常,让程序更加稳定。CPU使用率最常用的命令是top,它可以显示整个系统中所有进程的CPU使用情况并且可以进行排序,当然它不止可以监控CPU资源,还可以监控内存,IO等。默认以CPU的使用率排序。最简单的方式就是直接输入...

2019-07-08 11:49:14 737

从rtp包中提取opus及h265码流的小工具

可以在pcap抓包文件中提取指定ssrc rtp的h265或opus码流

2018-07-27

HK_28181摄像头PS流mpg文件

HK 28181摄像头PS流mpg文件,视频格式为h264。HK 28181摄像头PS流mpg文件,视频格式为h264

2017-10-20

HK 28181 PS流解包代码

HK 28181 PS流解包代码,可以提取出PS流中视频数据,音频数据

2018-12-21

Directshow视频采集,支持图像预览,支持根据策略设置分辨率及帧率

1. 采集模式为回调模式,默认视频格式为RGB24。 2. 支持设置采集的视频数据的分辨率及帧率,支持以预定义的策略设置采集的分辨率。 3. 支持视频预览。 4. 支持检索系统中可用的摄像头。 5. 支持打开指定的摄像头。

2018-03-20

空空如也

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

TA关注的人

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