- 博客(35)
- 收藏
- 关注
原创 ffmpeg实战4-将PCM与YUV封装成MP4
对于音视频同步 首先需要将自己设置一个基准,然后 再进行对于的编码时候,要将pts转换为,因为编码器的 base_time与我们自己设置的不同 所以为了 保持 pts*base_time后的时间一致,需要进行转换 pts1 * base_time1=pt2*base_time2,就能算出pts2,这个就是发送帧需要设置的 pts。这里需要注意的是记得调用avformat_write_header av_write_trailer,因为对于封装音视频的容器通常会有对于的信息头 和 信息尾。
2025-12-06 18:06:42
440
原创 ffmpeg实战2-从MP4文件提取 音频和视频
通过的mp4文件一般都是由 音频:AAC 视频:H264 组成可以通过mediainfo这款软件进行查看。
2025-12-02 13:19:56
897
原创 FFmpeg-实战1-从MP3音频文件中解码原始PCM音频
如何理解这里的context上下文这个概念呢?对于codec 可以理解成一个 算法工具包, 但是光有算法不行啊,还需要有对应 数据 以及 配置(如何进行特定处理) ,所以这个时候就需要有context 来 进行 不同场景的不同 处理配置。可以看到对应流信息通过avformat_find_stream_info 被放到了fmt_ctx里。然后遍历查找或者 用av_find_best_stream()这个接口进行查找对应的编码器。这里讲一下什么是平面格式,以及 什么是交错格式,以及PCM数据在文件中是存储的。
2025-12-01 22:08:23
427
1
原创 音频重采样注意事项--软件层面
但是如果原始数据的pts 比如 为 10000的时候,此时计算显示时间 pts/src_sample_dts(22k),那么最重要的就是原本视频的每一帧数据依旧对应上音频的每一帧数据,而一帧数据又有多个采样点。将pts* ratio(src_sample_ratio/dst_sample_ratio),那么为了保证视频重采样后,视频依旧同步,那么需要保证 时间同步。:对于不同的设备 所需要的采样率不同,所以此时需要对原始音频重新采样。已知 原数据采样率 ,一帧数据有多少采样点,以及目标音频的采样率。
2025-11-30 18:58:41
512
原创 深入剖析:基于epoll与主从Reactor模型的高性能服务器设计与实现
一个高性能、高并发的主从Reactor服务器骨架便得以建立。主Reactor负责高效接入新连接,从Reactor池负责处理已建立连接的I/O,线程池负责处理计算密集型业务,三者各司其职,共同支撑起百万级并发的服务能力
2025-10-10 16:12:56
880
原创 深入浅出高并发内存池:原理、设计与实现
:1.对于一些操作系统封装的malloc可能对于多线程并发场景下性能较差2.频繁申请释放不同大小的内存,导致大量内存碎片,降低内存利用率所以针对以上问题本项目采用了池化技术,像一些连接池,线程池,对象池。内存池:由我们自己负责管理一块大块内存,当我们需要的时候通过自己管理的接口进行内存的申请和释放,相比于传统的内存申请和释放来言,一方面因为一次申请大批内存,减少了系统调用以及,归还不连续内存块导致的内存碎片问题。
2025-09-26 22:58:20
1040
原创 mmap 虚拟地址映射
mmap允许你将一个文件或设备直接映射到进程的虚拟地址空间,这样进程就能像访问普通内存一样读写文件内容,无需频繁调用read或write等 I/O 函数。
2025-09-24 23:04:52
352
原创 MySQL --- 事务
其中隔离级别越严格,安全性越高,但数据库的并发性能也就越低,往往需要在两者之间找一个平 衡点。不可重复读的重点是修改和删除:同样的条件, 你读取过的数据,再次读取出来发现值不一样了幻读的重点在于新增:同样的条件, 第1次和第2次读出来的记录数不一样说明: mysql 默认的隔离级别是可重复读,一般情况下不要修改。
2025-05-23 15:35:00
605
原创 C/C++ Select Poll Epoll 多路转接
缺点:1.需要自己手动管理文件描述符,在循环监听时,每次都需要手动设置fd集合。2.每次使用fd集合都需要将其从用户态拷贝到内核态3.select每次监听,都需要在内核态进行遍历所有fd4.select能监听的fd有限。缺点:1.每次内核需要轮询检测哪些事件就绪2.每次使用fd集合都需要将其从用户态拷贝到内核态3.随着监听fd的增多,每次可能只有几个fd就绪,效率会随着下降。优点:1.不需要在循环设置监听事件,接口使用更方便2.没有监听事件数量设置(但过多,性能也下降)
2025-05-20 17:53:20
1046
原创 C++异步操作 - future async package_task promise
异步编程是一种程序设计范式,。其核心目标是,提升程序的并发性和响应速度。简单来说:就是不阻塞当前主线程,创建子线程,交给子线程操作但是线程之前的数据通信较为麻烦所以有了以上操作函数和类。
2025-04-22 18:48:18
487
原创 C++线程既没有Detach也没有Join产生的后果
今天我在模拟单机下多线程抢票的时候,写出了一个BUG ,那就是创建完线程后,既没有detach分离,也没有join等待,发现运行程序直接终止,无事发生,也就是说只要main结束,threads的生命周期会终止,调用它的析构,所以这就是为什么线程刚开始执行就终止的原因。然后我就进行网上搜查,发现原来线程如果在析构后,会向当前进程发送一个信号,进行终止,经过我进一步的仔细检查,发现我的代码没有写join,进行等待线程,然后我就进行调试,想看一下在哪里发生了终止。可以看到,只执行一两行就直接退出了,
2024-11-30 11:11:05
297
原创 AVL树(平衡二叉树)
subR的右子树插入结点导致subR的右子树偏高,而parent本来就因为subR导致右子树偏高,又在subR的右子树插入结点后,导致parent失衡。搜索二叉树的优化版,保证了树的平衡,即每个的结点的左子树高度与右子树高度差的绝对值不会超过1(0或1)。subR通过左旋,变成第三个图,从而达到需要左旋模型,然后再通过左旋parent,从而实现平衡。右左旋可以拆分为一个右旋,一个左旋,思想是先通过右旋把子树变为一个完完全全的需要左旋模型。为了保证二叉树的平衡,给每个结点引入平衡因子,父节点。
2024-08-27 21:01:47
302
原创 搜索二叉树BSTree的实现与应用
左子树小,右子树大的树叫作搜索二叉树,一般是没有重复的结点。如下图通过此树状结构可以实现类二分查找的效率,但是对于普通的搜索树,它最坏可能达到O(N)最好是O(logn)可以对搜索二叉树进行优化,从而有了平衡二叉树,后面的文章会对其进行讲解(敬请期待)。本文只对普通二叉树进行讲解。
2024-08-12 16:08:27
364
原创 C++多态之虚函数(补充)
当创建一个对象,具有虚函数的会比不是虚函数的类对象要大,那是因为存放这虚函数表的指针,指向虚函数表,当我们创建派生类对象的时候,通过继承也会生成一张与基类值相同的虚函数表。当在基类定义虚函数后,派生类通过继承的方式继承下来这张虚函数表,但是继承下来的虚函数表与父类的表并不相同,因为对虚函数表中重写的函数进行覆盖(重写)。类有几个父类,如果父类有虚函数,则就会有几张虚表,自己的虚函数只会跟着第一张虚函数表的后面。这是因为派生类的函数只实现功能,而由基类的函数作为借口。整体你可以当做两者结合。
2024-08-09 15:27:46
302
原创 C++---继承与多态
class A{};派生类 继承方式 基类而派生类(子类)中的成员访问变化方式满足这个公式:Min(成员基类的访问权限,继承方式)而派生类中对于基类的protected访问权限可以访问,但是对于private访问权限不可以访问!构造:先对基类构造,再对派生类构造(可以手动,因为初始化列表是按声明顺序进行定义,而基类对象是第一个声明的)析构:先对派生类析构,再对基类析构(自动调用,不可以手动,不然可能会出现问题)
2024-08-08 17:37:19
714
原创 模板template
/ 3、只有一个,类型转换一下也能用,也可以匹配调用(口味不对,将就一下也行)在我们写C语言的时候如果要进行交换运算,对于不同类型的数字要写对应不同的函数。但对于C++来说,多了模板后就可以只用写一个函数,而剩下的由编译器自己判断。// 1、都有的情况,优先匹配普通函数+参数类型匹配(成品+口味对)// 2、没有普通函数,优先函数模版+参数类型匹配(半成品+口味对)可以再也不需要用#define int Typedata。而编译器根据不同传参类型会调用不同的函数。对于不同类型的参数可以自己选择了。
2024-05-11 19:49:13
226
2
原创 C++ -匿名对象,new,delete
-------------------------------------------------------本篇结束。并且对于new和delete在你使用错误或者内存超限的时候会给你报详细的错误信息,而C中的函数仅仅只是一串错误码。p3 创建10个int型的空间前三个空间赋予1,3,4后面7个空间赋予0。而free仅仅是销毁类的空间,对于类中指向堆空间的指针并不会进行销毁,对于他的用法如下--------------------new。对于C++来说他有了新的关于内存管理的函数。
2024-04-24 09:08:27
366
原创 初始化列表、类的隐式类型转换
之前我们说过在创建一个类的时候,在构造的过程时候,编译器对于我们自定义构造的类型会调用他的构造函数,但是当自定义构造类型的构造函数没有的话,就无法调用。而对于我们之前讲的类成员给予缺省值,其实就是将缺省值传给初始化列表以此来进行定义.这个时候初始化列表就可以很好的解决这个问题。先进行声明然后再通过初始列表进行定义。初始化列表的具体是什么意思呢?我们甚至可以在private中。先: 然后,后面加大括号。而初始化列表就是定义。
2024-04-22 16:38:49
226
1
原创 拷贝构造函数
也就是说对于一个值传递,相当于创建一个临时变量d然后和创建变量d3给其赋予d2的值一样,创建的临时变量d也要给其赋值d2一旦进行拷贝,又要调用拷贝构造函数,然后以此进行递归,导致死循环。而对于编译器自己生成的拷贝构造函数只会进行字节拷贝也就是浅拷贝导致两个变量中的指针指向同一块的空间,可能导致修改其中一个类中的内容,导致另一个类中的内容也相应修改。
2024-04-21 13:38:30
224
1
原创 C++类与对象(一)-this指针、构造函数、析构函数
类与C语言中的结构体较为相似,但是更为方便这里借鉴了:【C++】类与结构体的区别_c++结构体和类的区别-优快云博客此外在类与对象中多加了几个关键字例如private可以避免随意的修改类中的变量此外对于类的内存计算和结构体差不多,对于类中的函数大小不需要加上去,只需要计算类中成员的大小,具体计算方法参考结构体的计算方法内存对齐对于空的类它的内存大小是1个字节。
2024-04-19 10:16:42
365
1
原创 C++入门-命名空间、函数重载、内联函数、引用
就相当于a+b替换掉Sum(2,3)这个的好处是减少调用函数的时间,但是只能适用于简短的函数,不然多次调用过长的函数会增加的代码量,在VS中对于长代码甚至直接就不替换,直接就调用函数。而当我们需要使用的时候可以将这个作用域展开,使其成为全局域的一部分,也可以只对其中一个函数进行展开,当我们想使用rand这个名字时候,发现标准库中已经用过了,那我们如果想用,就得创建一个私有的命名空间。在C中我们总因为指针苦恼,但是在C++中引用很好的解决了这个问题。std的命名空间,相当于创造了一个私有的作用域。
2024-04-16 22:24:00
377
原创 认识结构体
此时的struct STU 就可以当成自己创造的int 来定义一个叫xiaoming,xiaohong,xiaozhang的变量如果我们要对其赋值可以如下结构的特殊声明tag进行了匿名,如果出现了两个匿名声明编译器会把上⾯的两个声明当成完全不同的两个类型,所以是⾮法的。匿名的结构体类型,如果没有对结构体类型重命名的话,基本上只能使⽤⼀次。
2024-01-15 18:27:01
1170
1
原创 数据在内存中的存储(整数、浮点数)
根据国际标准IEEE(电⽓和电⼦⼯程协会) 754,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:• (−1)^S 表⽰符号位当S=0,V为正数;当S=1,V为负数• M 表⽰有效数字,M是⼤于等于1,⼩于2的• 2^E 表⽰指数位 举例来说: ⼗进制的5.0,写成⼆进制是 101.0 ,相当于 1.01×2^2。那么,按照上⾯V的格式,可以得出S=0,M=1.01,E=2。⼗进制的-5.0,写成⼆进制是 -101.0 ,相当于 -1.01×2^2。那么,S=1,M=1.01,E=2。
2024-01-15 17:31:53
1276
原创 字符函数和字符串函数
• strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。2如果source 指向的字符串的⻓度⼩于num的时候,只会将字符串中到 \0 前的内容追加到destination指向的字符串末尾。字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包 含 '\0' )。如1若传入的参数是'C'那么返回的值是'c',若是要模拟是实验那就将传入的字符加减32。◦ 第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字。
2023-12-03 20:52:21
391
1
原创 指针的理解(小白角度)
32位机器假设有32根地址总线,每根地址线出来的电信号转换成数字信号后 是1或者0,那我们把32根地址线产⽣的2进制序列当做⼀个地址,那么⼀个地址就是32个bit位,需要4 个字节才能存储。同理64位机器,假设有64根地址线,⼀个地址就是64个⼆进制位组成的⼆进制序列,存储起来就需要8个字节的空间,指针变量的大小就是8个字节。0x0012ff40就是a的地址如果我们想把地址取出,可以使用&取地址符号即&a,而地址指向的就是a的值即10。可以 *(*p2)------(*p2)取出的是p1的值即a的地址。
2023-11-26 21:12:13
839
1
原创 循环与选择for,while,switch,if
PS :如果只执行case 1: 需要才后面加入break;表达式1中可以直接定义变量int i = 0;若for() 语句1;没有{}包括时for只包含语句1。switch(整数,字符(ASCII),一个式子(a*b))continue结束本次循环continue下面的不再执行.第一个for执行一次(i=0)第二个for全部执行一遍.表达式1,2,3都可以省略但是;并且1,2,3都可以放入for里面。default:(相当于else)若要多个选择可以使用如下结构。switch的使用方法。
2023-10-23 21:43:32
79
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅