- 博客(19)
- 收藏
- 关注
原创 srtp数据加解密 - ortplib、srtplib
ortp_random 是 oRTP 中生成随机数的工具函数,主要用于 RTP/RTCP 协议字段的初始化。其实现应保证足够的随机性,避免预测风险(尤其在安全敏感的 SRTP 场景)。在自定义实现时,建议优先使用操作系统提供的安全随机源。该结构体在初始化 SRTP 会话时使用,确保通信各方采用兼容的加密参数配置,以实现安全的媒体流传输。是 SRTP(Secure Real-time Transport Protocol)库中的一个函数,用于。
2025-05-14 14:56:50
912
原创 流媒体 逐帧叠加混音实现
在音频处理中,混音可以通过FFmpeg或逐帧叠加的方法实现。逐帧叠加法涉及将两个单声道音轨逐帧加和,并使用裁剪防止溢出。在单声道中,一帧等同于一个采样点,而在立体声中,每帧包含左右两个通道的采样值。常见的采样格式包括int16_t和float。C++17引入的std::clamp函数可用于限制值在指定范围内。对于立体声处理,需以2为步长进行,而浮点音频处理则无需担心整数溢出。实际音频文件处理可使用libsndfile、FFmpeg或libav等工具,实时音频场景则适合使用PortAudio、RtAudio、
2025-05-14 10:18:10
391
原创 流媒体协议-RTP、RTCP、RTX、RTFB、NACK
一个标准的 RTP 包由以下部分组成:2RTP(Real-time Transport Protocol)是用于在 IP 网络上传输音频、视频和其他实时数据流的协议。RTP 数据包本身仅携带实际的媒体数据(例如音频帧、视频帧等),但它通常不会单独传输。RTP 数据包通常是通过其他协议封装的,尤其是协议,因为 UDP 是一个无连接、低延迟的传输协议,适合实时数据流。链路层负责将数据帧从源主机传输到目标主机。0x08000x0806网络层的主要协议是在传输 RTP 数据包时,通常使用或。
2025-05-13 17:56:58
982
原创 Protocol Buffers详解
potocol Buffers (简称 protobuf) 是 Google 开发的一种高效的数据序列化格式,用于结构化数据的序列化、反序列化和传输。跨语言支持:支持等多种语言高效二进制格式:比XML/JSON更小、更快强类型接口:通过.proto文件定义数据结构向后兼容:支持字段扩展而不破坏旧代码代码生成:通过编译器生成数据访问类singular: 单数字段(proto3默认)repeated: 数组/列表字段map <K,V>: 映射表字段(proto3特有)oneof。
2025-05-13 17:40:24
974
原创 堆排序C++ 详解
的顺序存储方式存储在一个一维数组中,并满足ki<=k2i+1且ki<=k2i+2(或满足ki>=k2i+1且ki>=k2i+2),其中i=0,1,2,…那么如何才能将一个任意树调整为堆呢?答案很简单,我们只需要从倒数第一个非叶子结点开始,从后往前,按下标,依次作为根去向下调整即可。如果有一个关键码的集合K={k0,k1,k2,…,kn-1},把它的所有元素按。:每个节点的值大于等于其左右孩子。:每个节点的值小于等于其左右孩子。是根据堆的这种数据结构设计的一种。大根堆/小根堆, 向上调整方法。
2025-03-21 11:16:52
731
原创 批处理脚本
如果变量set var2="var2"赋值过,然后将赋值set var2="var2"语句注释掉并运行,依然会输出 var2 is defined, the value is: “var2”,这是因为bat脚本变量不特殊处理的话是全局变量,只要脚本是在同一个cmd命令框运行便会存在,可通过 set var2= 清除。先给变量赋值 set var2=“var2”,则会输出两遍 var2 is defined, the value is: “var2”变量无需声明可直接引用,其值为空字符串,并且大小写不敏感。
2025-03-18 20:15:26
820
原创 QT learning
TBD:、QHBoxLayout : addLayout(layout), addwidget(组件)QLabelQSliderQWidget只设置一个setBaseSize,没有设置fixhight, fixwidth时,layout会根据布局动态变化大小PushBUtton里面可以setMenu:按钮点击,出现菜单QUuid 是 Qt 框架中的一个类,用于生成、操作和表示全局唯一标识符(Universally Unique Identifier, UUID)。
2024-11-15 09:54:54
970
原创 Git learning(dq)
例如: ``` git checkout origin/feature-branch ``` 这会将你的本地分支切换到名为`feature-branch`的远程分支。``` git checkout ``` 这里的``是你要切换到的远程分支的名称,2. 查看远程分支列表: ``` git branch -r ``` 这会列出所有远程分支的列表。. 切换到其他分支: ``` git checkout ```
2024-11-15 09:54:16
964
原创 手动添加Git Bash Here到右键菜单
5、在“open in Git”目录下右键—新建—字符串值“Icon”,双击编辑,其值为“D:\software\Git\mingw64\share\git\git-for-windows.ico”。6、在“open in git”目录下右键—新建—项“command”,其值为 "D:\software\Git\git-bash.exe",需要按照实际路径修改。4、在“shell”目录下右键—新建项“open in Git”,其值为“Git Bash Here",此为右键菜单显示名称。
2024-01-09 15:35:03
801
1
转载 位运算n & (n-1)的妙用
由此可以得出,n和n-1的低位不一样,直到有个转折点,就是借位的那个点,从这个点开始的高位,n和n-1都一样,如果高位一样这就造成一个问题,就是n和n-1在相同的位上可能会有同一个1,从而使((n & (n-1))!n = 10100(二进制),则(n-1) = 10011 ==》n&(n-1) = 10000。10&(-10)为 0010 = 2 所以10的因子中为2的有一个,2^k的形式的为2^1。((n & (n-1)) == 0),则高位必须全为0,这样就没有相同的1。
2023-11-14 14:43:18
715
1
原创 c++ assert() 使用方法
它用于检查“不应该”发生的情况。在运行过程中,如果assert 的参数为假,那么程序就会中止(一般地还会出现提示对话,说明在什么地方引发了assert)。assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用。这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。assert宏的原型定义在<assert.h>中,其作用是如果它的。频繁的调用会极大的影响程序的性能,增加额外的开销。
2023-11-14 14:12:00
526
1
转载 异或运算详解
校验和恢复主要利用的了异或的特性:IF a ^ b = c THEN a ^ c = b 应用:一个很好的应用实例是RAID5,使用3块磁盘(A、B、C)组成RAID5阵列,当用户写数据时,将数据分成两部分,分别写到磁盘A和磁盘B,A ^ B的结果写到磁盘C;想办法得到 a 或者 b,假设 结果 为 00001001(F肯定不为0),根据结果 的值我们发现,如果某一位的值为1,则在两个出现一次的数字中,在这一位上,一定一个是1,一个是0。时间复杂度为O(n),当然是线性的,空间复杂度O(1);
2023-11-14 13:54:17
4181
1
转载 内存泄漏检查:windows(CRT) linux(mtrace 内存追踪、valgrind 工具)
【精选】用mtrace定位内存泄漏-CSDN博客内存泄漏定位工具之 valgrind 使用 - 大橙子疯 - 博客园 (cnblogs.com)
2023-11-10 15:01:28
153
1
原创 C++原子操作 - 多线程编程:模板类型std::atomic
s'dsd, 也就是不会被线程调度机制打断的操作, 运行期间不会有任何的上下文切换。原子变量()是C++中用于的强大工具之一。它们提供了一种线程安全的方式来访问和修改共享数据,而。支持各种数据类型,如整数、布尔值、指针等,但是。你可以创建对象,并使用原子操作来读取和修改它们的值。我们使用时应该将 atomic object 进行初始化,因为默认的构造函数并不完全初始化他(并不是因为其初始值不明确,而是其lock未被初始化)。
2023-11-09 15:46:29
327
1
原创 C++中数据的存储分配
数据区BSS(segment 和Data segment)内存映射段(Memory mapping Segment)函数存放在代码区(Text segment)内核空间(Kernel space)
2023-11-09 15:17:26
74
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人