自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

彼此当年少,莫负好时光

操千曲而后晓声,观千剑而后识器。

  • 博客(55)
  • 资源 (2)
  • 收藏
  • 关注

原创 FFmpeg生成静音音频和黑屏视频命令

开发中有时需要生成静音音频或者纯色黑屏视频为便于测试或其他特殊应用场景,可以使用FFmpeg命令-f lavfi来搞定。生成静音音频可以使用anullsrc或者aevalsrc来生成静音音频,aevalsrc还可以生成其他类型声音。以下命令生成10s特定采样率和声道的静音音频,可以指定编码器进行编码。anullsrcffmpeg -f lavfi -i anullsrc -t 10 silent-audio.mp3# orffplay -f lavfi -i anullsrc=r=44100:

2022-01-06 17:13:35 9114 1

原创 FFmpeg HDR视频转SDR视频命令

之前蓝光盘电影多是AVC 1080p 8bit SDR格式视频,近两年4K电影流行,下载的蓝光电影多是HEVC 2160p 10bit HDR视频格式。ffprobe查看有如下属性:# 10bit HDRStream #0:0(eng): Video: hevc (Main 10), yuv420p10le(tv, bt2020nc/bt2020/smpte2084), 3840x2160 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 23.98

2021-12-22 23:08:37 10224 8

原创 FFmpeg 视频旋转处理命令

因为某种原因发现这个特别好玩,总结一下,为了演示效果还特意做了个字母小视频,眼快闪瞎了。

2021-12-17 22:43:53 13495 3

原创 AAC ADTS 媒体流格式分析 及 FFmpeg解析mp4的aac码流方法

和其他编码格式一样,AAC只是数据编码格式,码流组织格式有ADIF(Audio Data Interchange Format) 和 ADTS (Audio Data Transport Stream)。ADIF 与 ADTS的显著区别就是前者的编码信息存在一个固定的地方,后者的编码信息是每一个包中都有。所以ADIF主要用于磁盘存储文件,ADTS主要用于渐进式传输的网络流,本文主要分析ADTS流。ADTS 流格式ADTS流格式为ADTS头部加AAC裸数据。[ADTS Header](AAC ES d

2021-12-04 14:25:33 2330

原创 H.264媒体流AnnexB和AVCC格式分析 及 FFmpeg解析mp4的H.264码流方法

H264码流分两种组织方式,一种是AnnexB格式,一种是AVCC格式。首先要了解的是H.264编码规范只是规定了如何编码,并没有规定以何种方式来排列编码后的数据。就如同AES算法只是规定如何加密一组数据,并没有强制规定如果分组。H.264规范没有规定如何组织数据,但是在附录B中提供了一种可选方案,即Annex B格式。H.264 NALU 概念H.264视频编码后的数据叫NALU(Network Abstraction Layer Units)。NALU有多种类型,分为两大类:VCL(Vide.

2021-11-25 22:19:22 5355

原创 cmake CMakeLists.txt 常用模板

三年前整理过Makefile常用模板 ,一直写手写Makefile,近来不得不用到cmake,实践了一下感觉真香!功能强大!还是那句话 自己总结方便查阅,要是能帮到别人那是极好的~cmake命令依赖CMakeList.txt文件,解析成makefile文件,然后make编译。先按顺序介绍其最简的常用语法,详细语法查阅cmake官网,最后整理完整版示例。常见语法介绍cmake版本必选项。放在第一行,指定cmake最低版本。cmake_minimum_required(VERSION 3.5.1.

2021-11-02 18:07:15 3387 4

原创 深入研究C++虚函数表

class Base {public: virtual void f1(){ std::cout << __PRETTY_FUNCTION__ << std::endl; } virtual void f2(){ std::cout << __PRETTY_FUNCTION__ << std::endl; } virtual void f3(){ std::cout

2021-10-16 22:46:49 726 3

原创 C/C++ 字节对齐 和 类占用空间

基本数据类型长度目前系统以64位居多,下面列出64位系统下的基本数据类型长度。嵌入式开发或者其他对数据长度敏感的场景,建议使用int8_t / int16_t / int32_t等明确长度的类型。数据类型长度/字节char1short2int4long8long long8float4double8 (32位系统为4)void*8bool1结构体/类 字节对齐为了CPU高效访问数据,操作系统会对结构体/类等非

2021-10-15 18:13:39 616

原创 OWT Server 基于 RabbitMQ 的 RPC 工作模式分析

上篇文章提到过,OWT Server是模块化的结构,各个模块是可以独立部署的,模块之间的RPC调用都是基于消息队列RabbitMQ实现的。这篇文章分析一下OWT Server 基于RabbitMQ的RPC都有几种工作模式。RabbitMQ 工作模式先简单复习一下RabbitMQ 的工作模式,详细浏览其官网介绍。RabbitMQ有3个重要概念 交换机exchange、路由键routing_key、队列queue。1. 简单模式一个生产者、一个消费者,不需要设置交换机(使用默认的交换机)。2.

2021-09-16 21:59:42 972 1

原创 OWT Server 整体架构分析

基础模块架构图按自己的理解用 visio 大体画了一下。前一篇博客讲过OWT Server是模块化的设计,不同模块可以分开部署,便于新手入门,下面画了OWT Server的一些基础模块(支持WebRTC开会)的框架图,如果把这几个模块搞清楚了,差不多对OWT Server也就理解了。模块内部的 RPC 调用都是通过 RabbitMQ 消息队列实现的,都不是直接调用,即上图中 所有的虚线都是通过RabbitMQ间接通信的,而不是直接连接。模块内部流交换(Internal IO)默认用的是

2021-09-12 21:41:50 3613 6

原创 OWT (Open WebRTC Toolkit) 5.0 初体验与开发环境搭建

先打个草稿,有空补充。介绍Demo 体验提供docker开发环境搭建正常流程官方介绍曲线救国网络不佳境外服务器后记有问题可以留言。

2021-09-09 22:23:52 8934 18

原创 Linux C 语言日期时间函数总结

C 语言获取系统时间相关函数总结记录一下,用的时候不至于再去到处找了。函数精度说明time()秒获取系统时间ftime()秒 + 毫秒获取系统时间 1/10^3gettimeofday()秒 + 微秒获取系统时间 1/10^6clock_gettime()秒 + 纳秒获取系统时间 1/10^9sleep()秒延时函数usleep()微秒延时函数 1/10^6struct tm-存储年月日时分秒的结构loc.

2021-09-05 17:20:32 1360

原创 Linux编译FFmpeg libx264 libx265 libfdk-aac libmp3lame libvpx libopus等

有些Linux发行版可以在线安装ffmpeg,但是因为版权关系不能包含我们所需的编码器,有时候还是需要手动编译。下面介绍一些常见编码器的安装。libx264、libx265、libfdk-aac、libmp3lame、libvpx libopus。不需要的可以不安装,最终ffmpeg configure不指定特定的编码器就可以了。不想自己编译的可以直接下载我编译好的,GNU C Library (GNU libc) 版本大于等于2.17的系统都可以使用。常见的CentOS 7和Ubuntu16.04以上

2021-08-12 14:28:21 2595 1

原创 C++ 线程池

总结一下C++里面的线程池,用的时候直接Copy就可以了。为什么要用线程池呢?打个比方:不用线程池的话 每次有活,老板就要招一个人去干,干完活就把工人辞了。如果用线程池的话就是,老板招几个人干活,把任务按需分配给这几个人,活少的时候可能这几个人会闲着,但是活多的时候可以让这几个人排队一直干活。这种场景主要考虑如果活都比较小,后者可以省去频繁招聘员工带来的成本,忽略员工没活的时候成本消耗。就是说频繁的新建线程比较耗资源,如果同时新建线程比较多超过了一定的数量也会占用比较多的处理器资源,而线程空跑的时候资.

2021-04-10 17:16:18 2279

原创 搭建AppRTC服务器 (AppRTC+Collider+Coturn) 2019

本文介绍使用域名 HTTPS 的方式部署AppRTC服务,信令服务和STURN/TURN服务。本文使用虚拟机桥接模式下的Ubuntu18.04系统和小飞机代理。因为项目需要本地搭建一个AppRTC服务器,研究了好几天才基本弄完,但是也只是Web端可以访问,好多坑( ⊙ o ⊙ ),记录一下。0 准备工作0.1 配置代理服务器使用Ubuntu,服务器端需要用代理的时候,使用Shadow...

2021-02-02 15:22:39 6606 13

原创 Node.js 调用 C++ 方法 / C++ Addons 详解

最近开发涉及到了一些Node.js调用C++的地方,于是网上搜了一下,发现网上好多文章都是比较片面的东西,没法直接使用。于是花点时间总结一下。Android开发中Java 调用C++的部分叫JNI,Rust语言中调用C++的部分叫FFI,Node.js中调用C++的部分叫C++ Addons。本文总结Node.js使用非N-API方式调用C++函数的示例,主要针对node 8版本,不同版本会有api差异。Node.js 调用C++方法,其实是调用 C++ 代码生成的动态库,可以使用require(.

2021-01-24 22:15:00 13357 2

原创 Linux C/C++ 中锁的使用总结

本文总结C和C++中各种锁以及使用方式,主要是C语言中的互斥锁 mutex 和读写锁 rwlock,以及C++中的互斥锁mutex以互斥锁管理。C++中的各种mutex其实是对C语言中的mutex的面相对象的封装,此外的mutex管理部分的类其实是用RAII的风格对mutex对象进行进一步包装。此外线程间通信还有信号量,因为它不叫锁就不说了,还有个非常不常用的自旋锁也不说了,还有名字很罕见的闩 latch 与屏障 barrier 也不说了。感兴趣自己看 cppreference.com吧。1. C .

2020-07-27 21:09:35 7572 2

原创 Linux I/O 多路复用之select、poll、epoll详解与代码示例

如果写过最基础的TCP服务,那就应该清楚 accept 和 recv 函数是阻塞式的(默认),也就是说程序就卡在这个地方等待,直到有连接或者数据来到。如果不用多线程的话,一旦有数据到来就会一直处理这个连接的数据,而没法接收新的连接。其实操作系统可以在一个线程里轮询式处理这些事务,也就是常说的I/O多路复用。select,poll,epoll 都是I/O多路复用的机制。I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。s

2020-06-27 22:36:47 2165 2

原创 Node.js Async 流程控制库与 Promise 流程控制

Async库学习笔记Async是个功能比较强大的异步流程控制库,常用的流程控制模式有串行,并行和瀑布流模式。注意和【async await】区分开。Async串行控制串行控制的函数为function series(tasks, callback) {..}参数tasks为任务函数的数组,callback为回调函数。且数组中每个函数都有一个包含两个参数[error & res...

2019-11-09 21:19:16 382

原创 Node.js 数组 forEach 同步处理上下文语句

习惯了C语言系的思维方式,刚接触Node.js,它的异步处理让我头大。写代码遇到这么一个场景,需要循环对一个数组中的元素进行处理,全部处理完成后再执行一个last操作。但是JS的异步特性会使这个last语句先执行,所以花点时间研究研究forEach。Talk is cheap. Show me the code.forEach 用法forEach用于对数组结构进行遍历,看到有人说forEa...

2019-10-26 16:18:06 3226 1

原创 快速申请 Let's Encrypt 免费SSL证书 / CA证书

标题之所以说快速,因为如果你手速快的话3分钟就能申请成功~参考:https://github.com/Neilpang/acme.sh/wiki/说明Let’s Encrypt是由Internet Security Research Group(ISRG)运行的非营利性证书颁发机构,可以免费提供用于TLS加密的X.509证书。证书有效期为90天,在此期间可以随时续订。这个组织由Mozill...

2019-04-19 20:44:49 2395

原创 Git fork分支后与原仓库保持同步

假设原仓库为 https://github.com/lmshao/OldHub.git,fork后的新仓库为:git@github.com:lmshao/NewHub.git。clone新仓库$git clone git@github.com:lmshao/NewHub.gitCloning into 'NewHub'...Resolving deltas: 100% (1/1), do...

2019-03-21 22:42:31 4283

原创 C++ 智能指针 shared_ptr 详解与示例

shared_ptr 是C++11提供的一种智能指针类,它足够智能,可以在任何地方都不使用时自动删除相关指针,从而帮助彻底消除内存泄漏和悬空指针的问题。它遵循共享所有权的概念,即不同的 shared_ptr 对象可以与相同的指针相关联,并在内部使用引用计数机制来实现这一点。每个 shared_ptr 对象在内部指向两个内存位置:1、指向对象的指针2、用于控制引用计数数据的指针共享所有权如...

2018-12-24 22:58:18 90983 8

原创 C++ 智能指针 unique_ptr 详解与示例

在本文中,我们将讨论由C++11提供的智能指针std :: unique_ptr&amp;amp;amp;lt;&amp;amp;amp;gt;。unique_ptr &amp;amp;amp;lt;&amp;amp;amp;gt;是C++ 11提供的用于防止内存泄漏的智能指针中的一种实现。unique_ptr对象包装一个原始指针,并负责其生命周期。当该对象被销毁时,会在其析构函数中删除关联的原始指针。...

2018-12-22 23:24:16 115364 22

原创 C++ JSON 库 jsoncpp 新API的使用方法(CharReaderBuilder / StreamWriterBuilder)

既然看到了这篇文章你肯定知道Json是什么东西了,网上有很多解析Json的开源库,最近工作需要用到Json解析,研究发现jsoncpp使用很方便,网上也有很多使用方法介绍,目前为止能查到的基本都是比较老的API使用方法,编译器会提醒使用的某些API已经被弃用了,有的编译器还会直接报错,既然推荐用新的那就学一下新API的使用方法吧,记录一下。JSONCPP是C++中的生成与解析JSON 字符串...

2018-12-04 22:48:36 33987 15

原创 C/C++普通函数指针和类成员函数指针的使用

之前一直以为C++成员函数没法取地址,一直使用静态函数来充当回调函数,直到近日看别人的代码才发现类成员函数也有指针。。。总结记录一下。普通函数指针这面是普通函数的指针的使用方法。#include &lt;stdio.h&gt;void printSum(int a, int b) { printf("%d + %d = %d\n", a, b, a+b);}int m...

2018-11-06 22:02:22 5261 3

原创 WebRTC中的信令和内网穿透技术 STUN / TURN

Translated from WebRTC in the real world: STUN, TURN and signaling.最近刚接触到WebRTC,网上看到这篇介绍WebRTC的文章不错,仔细读了读还算有用,分享出来能帮到一些刚入门的人也挺好的,翻译不好的地方可以直接看原文。WebRTC可以进行P2P点对点通信,但是WebRTC仍然需要服务器:客户端需要服务器交换一些数据来协...

2018-11-01 22:32:30 15722 2

原创 C调用C++库和C++调用C库的方法

C++调用C的静态库/动态库C++调用C的函数比较简单,直接使用extern &quot;C&quot; {}告诉编译器用C的规则去调用C函数就可以了。CAdd.hint cadd(int x, int y);CAdd.c#include &quot;CAdd.h&quot;#include &amp;lt;stdio.h&amp;gt;int cadd(int x, int y) { printf(&quot

2018-07-23 23:39:49 68749 29

原创 C语言调用so动态库的两种方式

方式1:类似静态库的调用(使用头文件)这种方式生成的程序会在启动时候就加载so动态库。 add.hint add(int x, int y);add.c#include &quot;add.h&quot;int add(int x, int y) { return (x + y);}main.c#include &amp;lt;stdio.h&amp;gt;#include &quot;...

2018-07-23 00:27:02 47770 6

原创 Unix I/O复用:select函数与poll函数详解与示例

先从一个简单的场景来理解什么叫I/O复用。学习过UNIX TCP网络编程的同学肯定知道accept和recv是阻塞的函数,accept函数是等待客户端连接,接受连接后返回,继续执行recv函数等待读取客户端发送过来的请求。但是如果一直没有客户端连接程序就会卡在accept函数上,连接后如果客户端没有数据发送就会卡在recv函数上,没法做别的事情。在处理一个客户端连接的时候也没法监听新的连接。也就是...

2018-07-22 02:10:38 469

原创 C++使用递归和非递归的方式实现二叉树的遍历

二叉树是常见的数据结构,常见的有三种遍历方式:前序遍历(根→左→右)、中序遍历(左→根→右)和后序遍历(左→右→根)。使用递归的方式实现遍历比较简单,书上看到一个不使用递归的方法比较复杂,记录一下。二叉树节点定义typedef struct node { int value; struct node *left; struct node *right;}Node;...

2018-07-19 15:44:21 878

原创 使用FFmpeg进行屏幕录像和录音

有些时候我们需要对屏幕进行录制,比如制作视频教程,录制直播等。然而这方面的软件多是收费的,即使是免费试用版的还有水印,特别烦人。下面介绍使用FFmpeg进行屏幕录制的方法。Windows先安装dshow软件 Screen Capturer Recorder, 项目地址:https://sourceforge.net/projects/screencapturer/files/ 。然后查...

2018-07-16 17:01:10 43170 33

原创 通过OpenSSL生成自签名证书,认识RSA算法

前言OpenSSL是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。OpenSSL本身是一个基于C语言的库,但是它也提供一个名为openssl的可执行程序来实现它所具有的功能。 可以通过OpenSSL官网下载源码,Linux和MacOS系统configure一下,make一下就OK了,相信你会编译了。编译后源码根...

2018-07-06 15:50:45 2549

原创 RSA算法原理

RSA算法原理RSA加密算法是一种非对称加密算法。对称加密算法中加密和解密都得用同一个秘钥,必须保证秘钥不泄露才能保证数据的安全,加解密两方之间密钥的传递是存在安全隐患的。非对称加密算法中加密和解密使用不同的秘钥(公钥和私钥)。比如:甲方可以使用乙方给的公钥进行加密,乙方收到密文后使用自己的私钥进行解密。RSA算法是一种基于大数分解的非对称加密算法,由已知加密密钥推导出解密密钥在计算上是不...

2018-07-05 15:52:58 661

原创 RTP协议介绍以及C语言实现具有发送H.264视频功能的RTP服务器

RTP封装H.264视频规范以及C语言实现以前上学时间做嵌入式开发板Hi3516A的流媒体项目,现在又突然想起来,不想学过就忘了浪费了,所以又自己实现了一遍读取本地视频文件发送RTP视频流的程序,算是总结一下。网上关于RTP的介绍实在是太多,但是多数都是抄来抄去没有系统性,还是贴上代码更容易理解。 RTP封装H.264码流规范本文简单说明RTP结构和实现,详细说明请参考标准文档RT...

2018-05-19 15:04:40 9426 39

原创 AES算法描述及C语言实现

前言AES算法是当前最流行的对称加密算法,也是一种分组加密算法,分组密码就是把明文分为固定长度的一组一组,每次加密一组数据,直到加密完整个明文数据。AES算法根据分组长度可以分为AES128, AES192,AES256,其所要求的秘钥长度和加密轮数也各不相同。鉴于这三种模式的算法在本质上没有区别,所以本文主要介绍AES-128(数据分组为16字节,秘钥长度为16字节,加密轮数为10轮),并给...

2018-05-06 23:16:25 80759 67

原创 伽罗华域运算及C语言实现

伽罗华域(Galois Field)简介在数学中,有限域(或称伽罗华域)是一个包含有限元素的域。与其他域一样,有限域是进行加减乘除运算都有定义并且满足特定规则的集合。其中加法和乘法必须满足交换、结合和分配的规律。加法和乘法具有封闭性,即加法和乘法结果仍然是域中的元素。伽罗华域一般用GF(2M)GF(2M)GF(2^M)表示,这个域中含有2M2M2^M个元素。GF(2M)GF(2M)GF(2...

2018-05-03 00:36:42 6494 6

原创 图解分组密码五大工作模式

在密码学中,分组密码操作模式是使用分组密码来提供诸如机密性或真实性的信息服务的算法。基于分组的对称密码算法比如DES/AES算法只是描述如何根据秘钥对一段固定长度(分组块)的数据进行加密,对于比较长的数据,分组密码工作模式描述了如何重复应用某种算法加密分组操作来安全地转换大于块的数据量。 简单的说就是,AES算法描述怎么加密一个数据块,分组密码工作模式模式了如果重复加密比较长的多个数据块。 常...

2018-04-22 00:18:43 19993 2

原创 Makefile常用模板

做开发的特别是C/C++开发者一般都会用到Makefile,然而多数时候在公司做项目都不需要自己去写Makefile,仅仅停留在能看懂的基础上。因为make命令编译实在是太方便了,所以自己写写小项目用一用还是挺好的。网上关于Makefile教程也很多,总结一下近几年用到的常用脚本,方便自己查阅,如果能帮到别人那便是极好的^_^。 单文件项目其实一个文件的项目也没必要写Makefil...

2018-04-17 00:46:10 18541 18

原创 【Android JNI】Native层解析Java复杂数据类型HashMap

前提Java HashMap 是基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用null值和null键。HashMap是存放引用类型数据的容器,只能存放引用数据类型,不能存放如int、long等基础类型的数据。 这里用实际的例子来演示如何解析HashMap,在这个Sample中,HashMap作为参数从Java传递到Native(C/C++)层,然后在C代码中解析H...

2018-04-07 00:12:53 5692

ffmpeg-4.4.1-2021.12.23.tar.gz

ffmpeg+ffprobe 支持编码器: libx264 core:164 r3075M 66a5bc1 libx265 v3.5 libfdk-aac v2.02 libmp3lame v3.100 libvpx v1.10.0 libopus v1.3.1 libaom v3.2.0 openssl v3.0 支持的系统 OS: Ubuntu 13.04 or above CentOS 7 or above Other Linux distributions with GNU C Library (GNU libc) version 2.17 or above

2021-12-23

Xshell 6.0.0125 Personal (Free for Home/School) 2019/7

Windows上最好用的SSH/Telnet/串口登陆客户端,XShell 官方个人免费版,Xshell 6.0.0125 Personal (Free for Home/School) 2019/7。 ---------------------------------------------------------------------------------------------------------------------------------------------- 资源太贵了,大家可以点这个链接填邮箱,然后邮箱能收到下载链接了。 https://www.netsarang.com/zh/free-for-home-school/ ----------------------------------------------------------------------------------------------------------------------------------------------

2019-07-08

空空如也

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

TA关注的人

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