- 博客(192)
- 资源 (16)
- 收藏
- 关注
原创 H265(HEVC)编码技术介绍
编码树单元(Coding Tree Unit,CTU)是HEVC的基本编码单元,有如H.264/AVC的宏块(MicroBlock,MB)。编码树单元可向下分割编码单元(Coding Unit,CU)、预测单元(Prediction Unit,PU)及转换单元(Transform Unit,TU)。定义编码工具集和色深/色度采样支持(如8bit/10bit、4:2:0/4:2:2等)色度采样格式(0=单色,1=4:2:0,2=4:2:2,3=4:4:4)。40 01,type=32,VPS(视频参数集)
2025-12-16 13:33:57
482
原创 H.264编码技术介绍
根据当前宏块的位置和编码类型(Intra 或 Inter),编码器会做出一个预测图像块(称为预测块):帧内预测(Intra):从同帧中左边、上边的像素推导。帧间预测(Inter):从参考帧中通过运动矢量(MV)找到对应位置,拷贝出一个预测块。本文深入剖析了H.264/AVC标准的编码技术。从整体编码流程入手,对比了CAVLC与CABAC两种熵编码方式。接着探讨了profile与yuv的关联,以及level级别的计算。在质量参数控制上,详细解读了QP、CQP、CRF、preset等参数的关键作用。
2025-12-15 10:49:36
572
原创 redis7.x源码分析:(9) 内存淘汰策略
Redis 的内存淘汰机制是其在面对内存不足时,确保服务能够持续运行的重要特性。通过多种淘汰策略和高效的算法实现,Redis 能够在内存使用达到上限时自动清理部分数据,释放内存空间。合理配置内存淘汰策略和参数,可以有效提升 Redis 的性能和可靠性。
2025-12-08 16:13:44
686
原创 Linux Zero Copy技术
Linux Zero Copy 技术通过减少数据在用户空间和内核空间之间的拷贝次数,显著提高了 I/O 操作的效率。通过sendfilesplicevmsplice()tee()、TCP Zero Copy 和io_uring等多种实现方式,可以根据不同的应用场景选择合适的零拷贝技术。在实际应用中,Kafka 和 Nginx 等项目已经成功地利用 Zero Copy 技术提升了性能。然而,在处理大文件时,需要注意 PageCache 的限制,并选择合适的 I/O 模式以避免性能瓶颈。
2025-11-28 18:14:13
907
原创 redis7.x源码分析:(8) serverCron
2.数据库渐进式 Rehash:在字典容量变化时,将 rehash 操作分摊到多次 serverCron 调用中执行,避免单次操作阻塞服务。5.状态统计与更新:更新服务器的时间缓存、内存占用、键空间命中率等统计信息,为 INFO 命令提供数据。3.持久化相关:触发 RDB 快照的后台保存,以及将 AOF 缓冲区中的数据存盘(如果开启)。4.连接管理:关闭超时闲置的客户端,并清理输出缓冲区过大的客户端。1.过期键清理:采用主动和自适应策略,清理已过期的键,释放内存。,server.hz 可以通过配置文件中。
2025-10-13 09:30:00
210
原创 使用Azure OpenAI Realtime模型实现语音助理
我以官方给的WebRtc方式demo为例,实现了一个语音助手,其中包括指令设置以及tools的function使用,演示了如何触发tools指定的function,以此实现RAG以及更多功能。我们的提示词是通过它的instructions参数设置给模型的,另外它的tools参数是用来配置相关function的,需要注意的是tools目前还不支持mcp服务。在多模态大模型出现前,我们都是使用语音转文字(STT)+大模型+文字转语音(TTS)的方式间接实现语音输入输出。
2025-09-19 14:43:01
807
原创 使用ffmpeg实现音频文件分割
在处理长音频文件的语音转文字任务时,单一文件的处理时长往往随着音频时长线性增长。为了优化整体处理效率,将大文件分割为多个小片段并采用并发处理策略能显著缩短总转换时间。这种分治方法是处理大规模音频数据的有效实践方案。对于带封装格式的音频文件比如mp3、opus、wav等,我写了一个基于ffmpeg实现的按时长进行分割的功能。文件分割方式一般有按固定时长和VAD(静音检测)检测两种,也可以将两者相结合。基于boost asio实现的工作线程池,用于提交分割任务。
2025-09-19 13:45:24
451
原创 redis7.x源码分析:(7) 过期键处理
目前过期时间可以通过EXPIRE 、PEXPIRE 、EXPIREAT 、PEXPIREAT以及SET+EX等命令设置,查看过期时间可以使用TTL、PTTL,而删除过期时间可以使用PERSIST命令,具体用法可以自行查阅相关资料。对于过期键的判断其实也非常简单,从expires取到过期时间when后,直接与当前unix时间戳now进行对比,如果now > when,则判定为过期。函数在满足一定条件的情况下,会依次遍历所有数据库的expires字典,并且遍历删除一些过期的 key。未经许可,请勿转载!
2025-08-25 10:00:00
352
原创 统信(UOS)+ 麒麟9006C平台下CEF离屏渲染效率优化【记录】
起初我们模仿这个demo实现了客户端的离屏渲染功能(由于一些特殊需求,只能采用离屏渲染方式),在麒麟9006C(arm64平台,8核)+ UOS系统下运行似乎一切正常。),原因是我尝试渲染到Window(需要和GTK创建的窗口进行绑定) 时,仍然会出现软渲染CPU高的情况。由于针对OpenGL的开发经验不多,并且是在新的平台上,因此花费了不少时间查阅资料和验证尝试。命令发现该平台下的GLX并未实现硬件加速的能力,因此使用 GtkGLArea 时使用的是软渲染。
2025-08-21 09:30:00
484
原创 SRT协议分析
注:文章是从我的笔记中摘录过来的,由于两边格式不同,所以可能会出现部分段落格式不正确的问题。我在文章中介绍了SRT协议的基本语法格式,对控制包并未展开介绍,不过大部分控制协议格式都比较简单,唯一比较复杂的是握手相关的协议,感兴趣的小伙伴可以进一步查看RFC文档。
2025-08-12 10:00:00
1133
原创 在mac下手动编译迁移的android版webrtc组件
注意:本方式应对的是老版本的webrtc(M75),使用的NDK也是老的r19c,因此对于新版本的webrtc可能不适用。需要设置成 NDK 的编译器目录 /Users/plants/Workspace/Video/android-ndk-r19c/toolchains/llvm/prebuilt/darwin-x86_64/需要设置成 NDK 的安装目录 /Users/plants/Workspace/Video/android-ndk-r19c。3.在src目录下执行gn命令生成ninja编译脚本。
2025-07-02 16:48:56
257
原创 linux音视频采集技术: v4l2
在 Linux 系统中,视频设备的支持和管理离不开 V4L2(Video for Linux 2)。作为 Linux 内核的一部分,V4L2 提供了一套统一的接口,允许开发者与视频设备(如摄像头、视频采集卡等)进行交互。无论是视频采集、处理,还是编码和显示,V4L2 都提供了强大的支持。本文将简单介绍一下 V4L2 的工作流程以及如何使用它进行视频采集。v4l2并没有提供单独封装的API接口,而是通过 ioctl 系统调用以及v4l2所提供的特定参数来对设备进行控制和采集。:查询设备能力。
2025-01-07 15:37:54
1398
原创 windows下搭建运行mediasoup-demo
从官网下载最新的LTS版本安装包后直接安装,我本地目前使用的版本是 v20.9.0。如果对npm默认源的访问有限制,那就需要使用代理或者修改源地址。
2024-12-12 17:07:04
952
原创 IPv6万能地址[::]使用的注意点
当这个选项被设置为 true(1)时,套接字将不接受IPv4映射地址,这意味着它将只接受IPv6通信。当设置为 false(0)时,套接字将同时接受IPv6通信和IPv4映射地址,使得可以在单个端口上同时监听IPv4和IPv6。需要注意的是,IPv6的万能地址绑定监听后实际是可以同时支持IPv4和IPv6的客户端连接的(双栈环境中)。为 false 在IPv4和IPv6双栈环境中非常有用,可以简化服务端的实现代码,从而减少开发工作量。另外需要注意,当有两个套接字同时监听IPv4和IPv6的相同端口,并且。
2024-12-06 17:54:51
578
原创 redis7.x源码分析:(6) bio后台服务
当任务到来时,主线程将任务添加到相应操作类型的任务队列中,并唤醒等待在该队列上的线程。redis的BIO(Background I/O)顾名思义:后台I/O服务,是Redis中用于处理一些需要异步执行的后台任务的一个线程池。由此我们也可以看出,redis其实并非真正的单线程程序,只是它的主要数据库读写处理流程是在主线程完成的,但内部是会启动多种线程来辅助提升效率的。除了BIO的线程外,后续我还会讲解网络IO多线程的代码实现,也会涉及到整体主流程框架的实现原理。作者:jwybobo2007。
2024-11-28 09:54:39
379
原创 redis7.x源码分析(目录)
redis7.x源码分析:(1) sds动态字符串redis7.x源码分析:(2) adlist双向链表redis7.x源码分析:(3) dict字典redis7.x源码分析:(4) ae事件处理器(一)redis7.x源码分析:(5) ae事件处理器(二)
2024-11-24 23:56:47
380
原创 redis7.x源码分析:(5) ae事件处理器(二)
Redis的定时器实现比较简单,它并未使用最小堆或者时间轮之类的方式来管理定时事件,而是直接使用一个双向链表把所有的定时器事件串起来,然后通过遍历去实现一些功能。从代码中可以看出,最早超时时间就是通过遍历链表找出超时时间when最小的事件来实现的。对于定时器的删除操作不会立即执行,而是将定时器修改为无效,在下一轮的 processTimeEvents 中处理。它是在 aeProcessEvents 的函数末尾调用的,通过遍历链表确认是否有事件超时,然后执行相应的超时回调。接上篇,接下来看定时器事件的处理。
2024-11-23 13:00:00
431
原创 redis7.x源码分析:(4) ae事件处理器(一)
ae模块是redis实现的Reactor模型的封装。它的主要代码实现集中在 ae.c 中,另外还提供了平台相关的io多路复用的封装,它们都实现了一套相同的poll接口,就类似于C++中提供了一个接口基类,由针对不同平台的派生类去实现。aeEventLoop中的events是用于保存fd注册事件的数组,它是以fd值作为索引来存取事件的。实际使用的io模型会根据编译时定义的宏在 ae.c 的代码头部直接引入。接下来再看一下ae相关接口,先看下fd相关实现。
2024-11-22 16:00:28
549
原创 redis7.x源码分析:(3) dict字典
另外,dict对hash值相同的key采用了常规的开链法存储,而unordered_map在采用开链法的前提下,又使用了_M_before_begin将不同桶中的链表串联成了一个大链表,从而将遍历速度优化为O(n);还有就是,dict为应对服务器性能上的特殊要求,设计成了双hash表的形式,这也使得它的rehash等操作存在一些特殊性。hash表的创建比较简单直接略过,先看下 _dictExpand 的实现,它在hash表扩容缩容和创建时都会用到。两者在代码实现层面存在一些差异,比如gnustl的。
2024-11-14 18:05:00
710
原创 redis7.x源码分析:(2) adlist双向链表
listNode中的value定义为void *,所以它可以被用来存储任意类型的数据。而对于不同的数据,在处理时可能需要用到不同的函数,因此在list中定义了3个函数指针,分别对应不同类型数据的复制、释放和对比功能。当对value进行处理时,如果设置了函数指针,就有可能会调用它们进行相应处理。链表是一种常用的数据结构(如果不了解,请先学习数据结构),由于c语言本身没有实现标准的链表库,所以redis自己实现了一个双向链表。双向链表在redis内部的使用非常的多,几乎所有模块中都有用到。
2024-11-12 18:03:49
411
原创 redis7.x源码分析:(1) sds动态字符串
其实它和C++标准库中的string在一定程度上是比较类似的,都是用来完成对字符串缓冲区的动态分配、管理以及其它一些相应操作的。另外,sds在设计中本身也是二进制安全的,而且sds会在末尾多分配1字节并且置’\0’,用于防止一些字符串操作的越界问题。sds的定义非常简单,直接就是一个char*的别名,因此sds本身具备C字符串的特性,可以使用strcpy、strlen等函数。sds在分配空间时,是包含头结构的,但真正返回的却是buf成员的地址,这就是sds具备C字符串的特性的原因。
2024-11-11 18:02:08
516
原创 linux下编译鸿蒙版curl、openssl
是一个用相对路径表示的统一编译安装目录,openssl和curl都会引用以及安装到这个目录下,所以要保证两个开源库使用的编译脚本中的这个相对路径指向同一目录。如果有什么问题的话,也可以自己手动改成想要的路径,两个脚本一致就行。目前我编译的全部都是静态库,如果需要编译动态库的话,还需要调整下编译脚本中的参数。具体的参数可以查看openssl和curl的编译说明。curl使用的版本是 7.81。如果中间没有错误的话,在。下会生成以下文件和文件夹。
2024-10-12 17:00:08
1927
1
原创 linux下不同库出现符号冲突的解决方式
在linux下开发时,可能会碰到不同库导出同名函数符号,导致行为异常的问题。举个例子:我的test.cpp需要链接以及,并且两个so库中都有一个同名的函数符号PrintInt,那在 test.cpp 中我想调用liba.so的PrintString时实际会调用函数符号呢?答案是根据链接顺序来。先链接先加载哪个库就会使用哪个库的符号。假设我们先链接加载的libb.so,那test实际会调用的就是libb.so中的PrintInt,这很明显不符合我们的期望,并且很可能会更一步导致crash。
2024-09-24 17:01:28
1192
1
原创 ubuntu下miniconda安装方式
全部执行完毕后,重新登录终端,就可以进入默认的 base 环境。接下来可以继续使用命令创建和切换所需要的python环境。
2024-04-10 10:30:15
583
原创 es5标准下 javascript 类的一种继承方式【记录】
以ES5标准为例的继承方式 // 父类 function Base(a, b) { this.x = a; this.y = b; this.arr = [a, b]; } Base.prototype.add = function(a, b) { this.x += a; this.y += b; } // 子类 function Child(a, b, c) { Base.call(this, a, b); this.z = c; }
2021-03-04 11:20:57
285
1
原创 gdb分析coredump的几个常用命令介绍
1.info proc mappings显示各个模块(可执行程序、动态库等)segment映射的虚拟内存地址列表2.info register显示寄存器的值例:(gdb) info registerrax 0xdbbb6a00007f719b -2613378610517544549rbx 0x9e4b82c0 2655748800rcx 0x3 3rdx 0x0 0rsi
2020-12-09 10:35:22
1482
1
原创 linux errno参考
#define EPERM 1 /* Operation not permitted */#define ENOENT 2 /* No such file or directory */#define ESRCH 3 /* No such process */#define EINTR 4 /* Interrupted system call */#define EIO 5 /* I/O error */#define ENXIO 6 /* No such device .
2020-11-30 23:50:47
458
原创 【错误记录】xcode codesign失败
使用codesign签名APP时出现:because larger updated load commands do not fit (the program must be relinked using a larger -headerpad value) 的错误提示。原因猜测是文件头中的预留空间不够放置生成的签名数据解决方式:xcode连接参数other linker中添加-headerpad_max_install_names选项...
2020-09-27 10:34:41
517
原创 【WebRTC】几个重要sdp参数说明
o=- 2833773620626745940 2 IN IP4 127.0.0.1s=-t=0 0// ice模式: full / lite, 设置lite表示始终为controlled,不需要发起STUN binding探测,只需要回复 binding response, 在开发SFU服务时非常有用, 只需要服务器一方设置为lite (都为full时, 双向探测;都为lite时, 互不探测)a=ice-litea=group:BUNDLE 0 1a=msid-semantic: WMS i.
2020-09-07 15:53:48
5531
1
原创 【WebRTC】web前端+nodejs测试demo
1.服务端使用nodejs搭建,使用的module为express、nodejs-websocket。实现了简单的信令协商,代码如下:// server.jsvar ws = require("nodejs-websocket");var fs = require('fs');var https = require('https')var express = require('express');var app = express();var userList = {};var
2020-09-07 11:23:45
1618
1
原创 vscode编译调试linux c/c++
1.远程打开linux服务器上的开发工程文件夹(具体工程不进行介绍了),如:/home/user/my_pro2.在产生的 .vscode 文件夹下放置 launch.json,tasks.json 配置文件,内容如下:launch.json:{ "version": "0.2.0", "configurations": [ { // 工程项目名称 "name": "test1", "
2020-08-17 13:43:11
393
原创 linux下使用gclient工具报错的问题处理
Your PATH contains a literal "~", which works in some shells but will break when python tries to run subprocesses. Replace the "~" with $HOME.如果出现如上的错误,说明在 exportdepot_tools的路径时,使用了~符号来表示用户文件夹,而p...
2020-01-04 17:35:26
1588
原创 RTP序列号以及时间戳是否回绕的判断
int isNewerSequenceNumber(uint16_t sequence_number, uint16_t prev_sequence_number) { return sequence_number != prev_sequence_number && ((uint1...
2019-12-17 17:55:59
1075
原创 OSX以及IOS app 崩溃符号查找
奔溃信息:Thread 29 Crashed:0 my 0x000000010c27d2d4 0x10c14d000 + 12459081 my 0x000000010c287625 0x10c14d000 + 12877172 my 0x000000010c27669f 0x10c14d000 + 1...
2019-09-20 16:37:03
497
原创 macos下生成icns图标文件
1.新建文件夹,将图片放到该文件夹下,图片命名如下icon_16x16.pngicon_16x16@2x.pngicon_32x32.pngicon_32x32@2x.pngicon_128x128.pngicon_128x128@2x.pngicon_256x256.pngicon_256x256@2x.pngicon_512x512.pngicon_512x512@2x....
2019-02-14 17:15:23
1155
原创 QSlider样式qss美化
QSlider { background-color: rgba(22, 22, 22, 0.7); padding-top: 15px; padding-bottom: 15px; border-radius: 5px;}QSlider::add-page:vertical { background-color: #FF7826; width:5px; border-rad...
2018-12-26 14:43:56
3118
2
linux开发常用帮助文档
2011-12-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅