- 博客(447)
- 收藏
- 关注
原创 【Linux】进程间通讯-消息队列
消息队列是一种进程间通信机制,本质上是内核提供的链表数据结构。发送进程向队列插入消息节点,接收进程则删除节点读取数据。消息结构包含类型标识符(mtype)和正文(mtext),大小受系统限制(MSGMAX/MSGMNB)。关键操作包括:msgget创建队列、msgsnd发送数据、msgrcv接收数据、msgctl控制队列。使用时需定义消息缓冲区结构,通过msgtype区分消息类型。生产者-消费者模式中,双方需约定相同的IPCKEY标识队列。示例代码展示了队列创建、消息发送/接收及队列删除的完整流程,可通过i
2025-06-09 16:09:30
537
原创 【Linux】Linux进程间通讯-信号
函数功能:设置某一信号的对应动作参数说明:第一个参数signum:指明了所要处理的信号类型,它可以取除了SIGKILL(9号信号)和SIGSTOP(19号信号)外的任何一种信号。第二个参数handle关联动作含义SIG_DFL执行该信号的默认处理动作SIG_IGN忽略该信号提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉(catch)一个信号signal函数可以自定义回调函数,来处理特定的信号这里我们自定义的回调函数,然后打印对应的信号。
2025-06-09 00:39:02
297
原创 【Linux】Linux进程间通讯-共享内存
要使用一块共享内存,进程必须首先分配它。随后需要访问这个共享内存块的每一个进程都必须将这个共享内存绑定到自己的地址空间中。在 Linux 系统中,每个进程的虚拟内存是被分为许多页面的。这些内存页面中包含了实际的数据。每个进程都会维护一个从内存地址到虚拟内存页面之间的映射关系。尽管每个进程都有自己的内存地址,不同的进程可以同时将同一个内存页面映射到自己的地址空间中,从而达到共享内存的目的。分配一个新的共享内存块会创建新的内存页面。
2025-06-07 15:06:48
1001
原创 【Linux】Linux 进程间通讯-管道
进程间通信(IPC)是实现不同进程间数据共享和同步的重要手段。文章介绍了IPC的基本概念、目的和分类,重点讲解了匿名管道的实现原理和使用方法。管道通过内核缓冲区实现单向数据传输,适用于父子进程通信,具有流式传输、同步互斥等特点。示例代码展示了如何使用pipe和fork函数建立父子进程间的管道通信,并分析了字节流通信的特性。管道通信随进程退出而释放,需注意读写端的关闭时机和双向通信的建立方式。
2025-06-06 23:51:06
1309
原创 【Linux】 Linux 进程控制
摘要: 本文详细介绍了Linux进程管理中的关键概念和操作。主要内容包括: 进程创建:重点讲解fork()函数的工作原理、返回值机制和写时拷贝技术,分析父子进程的执行流程。 进程终止:阐述进程退出的三种场景,介绍退出码的作用及查询方法,对比return、exit()和_exit()三种退出方式的区别。 进程等待:说明父进程等待子进程的必要性,演示wait()和waitpid()两种等待方法的使用,展示如何防止僵尸进程的产生。 文章通过代码示例和运行结果直观展示了进程创建、终止和等待的全过程,并提供了监控进程
2025-06-05 23:42:22
1115
原创 【Linux】Linux程序地址基础
本文深入探讨了程序地址空间与进程虚拟地址空间的区别。通过代码实验验证了程序地址空间的组成结构,包括代码区、字符常量区、已/未初始化区、堆区和栈区的内存分布特点。重点分析了进程虚拟地址空间的实现机制,指出每个进程通过独立的mm_struct结构体维护虚拟地址映射,并通过页表转换为物理地址。文章解释了父子进程共享相同虚拟地址但可能指向不同物理地址的现象,介绍了写时拷贝技术对性能的优化作用。最后强调了虚拟地址空间机制对进程隔离和内存保护的重要性。(150字)
2025-06-04 14:48:25
839
原创 【Linux】Linux 进程基础
在时间片轮转调度算法中,系统根据先来先服务的原则,将所有的就绪进程排成一个就绪队列,并且每隔一段时间产生一次中断,激活系统中的进程调度程序,完成一次处理机调度,把处理机分配给就绪队列队首进程,让其执行指令。从上述的结果可以看出,main函数的进程和fork创建的进程打印的结果是一样的,并且通过pid和ppid发现,fork的父进程就是main函数的进程,说明fork所创建出来的子进程和父进程在内存上映射。进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。
2025-06-03 22:56:08
1075
原创 【Linux】pthread多线程同步
线程同步与互斥锁机制 本文介绍了线程同步的核心概念和互斥锁的应用。线程共享全局变量时可能引发数据安全问题,临界区的原子操作需要通过同步机制保证。互斥锁(mutex)是最常用的同步工具,通过锁定和解锁操作确保同一时间只有一个线程访问共享资源。文章详细解析了互斥锁的5个关键API函数:初始化(pthread_mutex_init)、加锁(pthread_mutex_lock/pthread_mutex_trylock)、解锁(pthread_mutex_unlock)和销毁(pthread_mutex_dest
2025-06-03 01:00:27
838
原创 【Linux】pthread多线程基础
线程概述与创建 线程是轻量级进程,允许应用程序并发执行多个任务。一个进程包含多个线程,所有线程共享全局内存区域(如数据段、堆内存),但拥有独立的栈空间。线程比进程创建更快,资源消耗更少,适合高效并发处理。在Linux中,线程本质仍是进程,可通过ps -Lf pid查看线程ID。 线程与进程的主要区别在于: 资源共享:线程共享内存,通信更便捷;进程需通过IPC机制。 创建开销:线程创建无需复制内存和页表,速度更快。 创建线程使用pthread_create(),需指定线程函数和参数。线程终止方式包括:主动调用
2025-06-02 20:36:51
944
原创 【音视频】 FFmpeg 硬件(AMD)解码H264
硬件编解码是利用GPU等独立硬件模块进行视频编解码的技术,能降低CPU负荷,提高性能,但兼容性和画质处理较弱。软件编解码则完全依赖CPU,兼容性更好但功耗较高。常见的GPU编解码方案包括厂商SDK(如NVIDIA的NVENC、AMD的AMF)和FFmpeg集成方案。不同平台对硬件编解码的支持差异较大,Windows主要使用Direct3D/DXVA2,Linux支持VAAPI/VDPAU,而macOS使用VideoToolbox。FFmpeg提供了跨平台的硬件加速接口,但在功能完整性和易用性上仍有不足。硬件
2025-06-01 19:45:46
1201
原创 【音视频】FFmpeg 硬件(NVDIA)编码H264
原代码使用的是nvdia进行解码,但是我的显卡是AMD的,因此不支持这个解码器,因此该代码转载别人写的代码,具体的测试结果仅供参考!编码器预设编码时间比特率线程数线程类型libx264ultrafast306ms未指定未指定h264_nvencultrafast278ms906.10kbps未指定未指定libx264superfast381ms未指定未指定h264_nvencsuperfast226ms906.10kbps未指定未指定libx264。
2025-05-31 16:17:14
966
原创 【音视频】FFmpeg 编码H265
摘要:本文介绍了使用libx265将本地YUV文件编码为H265格式的实现过程。主要包括:准备YUV输入文件和H265输出文件路径,初始化解码器(查找编码器、分配上下文、设置视频参数),配置高级编码参数(GOP大小、B帧、preset等),处理编码延迟和多线程设置,以及实现文件读取、帧分配和循环编码流程。文章还展示了如何通过FFmpeg查询libx265的更多编码选项。
2025-05-30 21:41:32
1199
原创 【音视频】H265 NALU分析
H265视频编码技术概述 H265(HEVC)是H264的升级标准,在相同画质下可减少39-44%的视频大小。主要改进包括:1)支持更大的编码单元(8x8至64x64);2)帧内预测模式增至33种;3)采用更先进的运动补偿和矢量预测;4)优化并行处理架构。H265码流由视频编码层(VCL)和网络抽象层(NAL)组成,NAL单元包含2字节头信息(含NALU类型)和前缀Start Code(0x000001)。相比H264,H265运算复杂度更高但压缩效率显著提升,更适合高清视频传输。
2025-05-30 15:35:26
885
原创 【音视频】RTP解包AAC 代码实现
本文实现了一个RTP报文的解析Demo程序,能够读取本地AAC文件并模拟RTP报文传输过程。程序主要功能包括:解析RTP报文获取AAC数据,添加ADTS头后保存为本地AAC文件。核心实现使用了rtp_aac_test_t结构体存储编解码信息,通过rtp_decode_packet回调函数完成AAC数据的ADTS封装。该Demo未实现网络传输相关的UDP乱序重排和丢包处理,仅用于测试验证RTP解析及AAC封装的基本流程。程序展示了ADTS头的构建过程,包括采样率索引、声道配置等参数的设置,最终生成符合标准的A
2025-05-29 18:34:09
634
原创 【音视频】RTP解包H264 代码实现
本文介绍了手动解包RTP封装的H264视频流并保存为本地文件的方法。通过模拟接收端处理RTP包,将解包后的H264数据添加startcode后写入文件,可直接用ffplay播放。文章详细说明了实现流程,包括文件读取、结构体定义(如rtp_h264_test_t和rtp_payload_t)、回调函数注册以及解包处理逻辑,重点关注了rtp_decode_packet函数如何提取H264裸数据并添加startcode。该方法未处理网络传输中的乱序和丢包问题,后续需针对实际网络环境优化。
2025-05-29 16:52:39
1100
原创 【音视频】RTP封包AAC 代码实现
本文介绍了通过UDP发送RTP封装AAC音频数据的方法。实现流程包括:读取本地AAC文件作为音频源数据,定义rtp_aac_test_t结构体存储AAC参数和socket信息,使用rtp_payload_t结构体处理RTP封包回调函数。通过设置payload类型为97(mpeg4-generic)创建AAC编码器,实现RTP数据封装,最终可通过ffplay或VLC播放SDP文件来接收并播放音频流。
2025-05-29 00:34:04
599
原创 【音视频】RTP封包H264 代码实现
本文实现了一个通过RTP over UDP发送H264视频流的程序,支持ffplay和VLC播放。核心功能包括:读取本地H264文件,封装为RTP数据包,通过UDP发送,并生成对应的SDP文件用于播放。程序使用自定义结构体rtp_h264_test_t管理RTP编解码参数,包括NALU分片、SPS/PPS参数等。通过回调函数rtp_alloc和rtp_encode_packet实现RTP包的内存分配与网络发送。Windows平台需初始化Winsock套接字,并指定目标IP和端口。最终可通过VLC加载SDP文
2025-05-28 00:23:34
467
原创 【音视频】H264 SPS PPS 介绍
SPS和PPS是H.264视频编码中的关键参数集,分别存储全局编码配置和图像参数。SPS包含图像宽高、编码档次等信息,PPS则涉及量化参数、熵编码模式等。它们通常位于码流起始位置,可通过Wireshark抓包或SDP的Base64字段获取。解析时需先解码Base64,再按H.264标准提取语法元素。工具如spsparser可辅助解析这些参数,便于分析视频属性。
2025-05-27 18:08:15
909
原创 【音视频】H.264在RTP中的负载类型与SDP参数解析
H.264视频数据在RTP传输中有三种负载模式,通过NALU头部结构(F/NRI/Type字段)识别。Single模式(Type 1-23)直接封装NALU;Non-interleaved模式支持STAP-A组合包(Type 24)和FU-A分片(Type 28);Interleaved模式通过STAP-B/MTAP实现多时间调度。SDP配置需指定packetization-mode(0/1/2)及profile-level-id等参数。解析时需根据NALU类型处理分片重组(如FU-A分片的S/E标志位),
2025-05-27 17:17:35
719
原创 【音视频】RTCP协议介绍
RTCP(实时传输控制协议)是RTP的姐妹协议,主要用于监控传输质量、标识参与者和会话管理。其报文分为五种类型:SR(发送方报告)、RR(接收方报告)、SDES(源描述)、BYE(离开通知)和APP(自定义报文)。SR包含发送状态和时间戳,RR反馈接收质量统计。RTCP报文采用统一格式,包含版本号、填充位、报告块数量和类型等字段,并通过SSRC标识参与者。SR报文含NTP时间戳、RTP时间戳和发送统计,RR报文则记录丢包率、抖动等指标。两者协同确保实时流媒体的传输质量控制和同步。
2025-05-26 17:55:17
724
原创 【音视频】录屏推流项目开源
该项目是一个音视频处理系统,主要实现多源音视频采集、编解码、传输及图像处理功能。支持摄像头/桌面视频和麦克风/桌面音频的采集与合成,具备AMD显卡硬编解码能力(仅Windows平台)。系统可本地录制MP4文件,并支持RTMP/RTSP推流(实测延迟500-700ms)。采用QT5开发无边框UI界面,集成OpenCV实现人脸检测、磨皮美白等图像处理功能。技术栈包含FFmpeg 6.0、OpenCV4.2和QOpenGL,项目定位为音视频技术实践平台,重点覆盖编解码、传输和图像分析等技术领域。
2025-05-26 00:42:46
885
原创 【音视频】SDP协议介绍
摘要: SDP(Session Description Protocol)是一种基于文本的会话描述协议,用于描述多媒体会话参数,但不参与传输或协商。其格式为<type>=<value>,包含会话级(如名称、时间)和媒体级(如类型、端口)参数。SDP需与其他协议(如SIP、RTSP)配合使用,通过紧凑编码提高效率。关键字段包括版本(v)、源(o)、会话名(s)、时间(t)和媒体(m)。可选字段提供额外信息,如URI、带宽等。媒体描述(m行)定义类型、端口和格式,属性(a行)补充编码细节
2025-05-25 20:43:15
784
原创 【音视频】RTSP推流拉流抓包分析
RTSP协议是一种基于文本的应用层协议,用于控制实时媒体流的传输。它与HTTP类似但具有关键差异:RTSP支持双向请求、保持会话状态,并通过RTP协议传输媒体数据。典型的RTSP操作包括DESCRIBE、SETUP、PLAY等命令,实现流媒体会话的建立、控制和终止。文章通过抓包分析展示了推流和拉流过程中的RTSP报文交互,包括OPTIONS、SETUP、PLAY等请求及响应,以及RTP数据包的传输过程。RTSP作为流媒体的"网络远程控制"协议,通常与RTP/RTCP配合完成媒体数据传输。
2025-05-25 14:08:53
335
原创 【音视频】RTP封包AAC
本文介绍了AAC音频在RTP协议中的封装格式,主要基于RFC 3640规范。AAC数据需先去除ADTS头(7或9字节),然后添加RTP头部和AU相关字段。关键步骤包括:添加16位AU-headers-length字段、2字节AU-header(包含13位AU长度信息),最后填充AAC有效载荷。SDP参数中需配置AudioSpecificConfig(采样率、通道数等)以及AU-header字段位数(如sizeLength=13)。典型应用场景下,单个RTP包仅含一个AU,此时可简化AU-header结构。文
2025-05-25 01:02:13
893
原创 【音视频】RTP封包H264
本文介绍了H264视频数据通过RTP协议传输的打包方法,主要参考RFC6184标准。RTP支持灵活的负载格式协商,适用于低延迟音视频传输。H264编码数据分为VCL(视频编码层)和NAL(网络抽象层),其中NAL单元(NALU)是传输的基本单位。NALU包含1字节头部和数据部分,头部定义了帧类型、重要性等级等信息。 文章详细讲解了两种RTP打包方式: 单一NALU模式:当NALU≤1400字节时直接封装到单个RTP包; FU-A分片模式:对较大NALU进行分片传输,满足MTU限制(1500字节)。 实际应用
2025-05-24 23:58:46
767
原创 【音视频】RTP协议介绍
RTP报头格式包含多个关键字段,用于实时传输协议的数据包标识和处理。报头固定12字节,包含版本号(V)、填充位(P)、扩展位(X)、CSRC计数(CC)、标记位(M)、载荷类型(PT)、16位序列号(用于排序和丢包检测)、32位时间戳(用于同步)以及32位SSRC(唯一标识数据源)。可选CSRC字段用于标识混合流中的原始数据源。推流端通过SSRC标识数据源,拉流端则利用SSRC和CSRC来识别数据来源和处理混合流。典型应用包括直播推拉流、音视频会议等场景,其中SSRC用于区分不同数据源,CSRC则记录混合前
2025-05-24 20:49:23
831
原创 【音视频】RTSP协议介绍
RTSP(实时流传输协议)是一种网络协议,专为低延迟流媒体传输设计,广泛应用于视频监控、IPTV、视频会议等场景。本文介绍了RTSP的基本原理、应用场景及其与其他流媒体协议(如HTTP、RTP、RTMP)的对比。RTSP通过请求/响应机制工作,配合RTP实现媒体数据传输,支持播放、暂停等控制操作。常见RTSP方法包括OPTIONS、DESCRIBE、SETUP、PLAY、PAUSE和TEARDOWN,状态码则用于指示请求处理结果。RTSP凭借其实时性和灵活控制能力,在流媒体领域占据重要地位。
2025-05-24 14:03:59
734
原创 【音视频】RTSP服务器搭建
ZLMediaKit是一个开源的流媒体服务器,支持RTMP、RTSP等格式,并支持格式互转。本文详细介绍了如何下载、编译和运行ZLMediaKit。首先,通过gitee获取源码并更新子模块。接着,安装必要的编译工具如gcc、cmake和依赖库如openssl、ffmpeg等。然后,使用cmake构建项目并进行编译。编译完成后,进入可执行文件目录启动服务器。最后,通过ffmpeg和ffplay进行推拉流测试,展示了RTSP、RTMP和RTP等协议的使用方法,并利用WireShark抓包分析RTP数据流。
2025-05-22 23:23:32
1033
原创 【网络编程】Https概述
简单来说,https=http+ssl/tls,即加密的httpHTTPS(HyperText Transfer Protocol Secure)是HTTP协议的安全版本,用于在客户端(如浏览器)和服务器之间安全地传输数据。HTTPS通过加密机制来保护用户和网站之间传输的信息,确保数据的机密性和完整性。HTTP:数据以明文形式传输,容易被拦截和篡改,适用于对安全性要求不高的通信。HTTPS:数据加密传输,提供更高的安全性,特别适合保护敏感信息。和是用于在计算机网络中提供安全通信的加密协议。
2025-05-22 01:20:10
1133
原创 【网络编程】Http概述与C++简单WebServer
HTTP(超文本传输协议)是用于客户端和服务器之间数据传输的应用层协议,主要用于Web浏览器和服务器之间的通信。它最初设计用于传输HTML文档,现支持多种数据类型。HTTP具有无状态性,每个请求独立,不记录之前的信息,需通过Cookies或Sessions保存状态。HTTP请求过程包括DNS查询、TCP连接、HTTP请求、服务器响应和TCP断开。HTTP协议头分为请求头和响应头,分别包含客户端请求和服务器响应的关键信息。POST与GET是HTTP的两种主要请求方法,区别在于数据传输方式和安全性。HTTP状态
2025-05-22 00:47:53
1266
原创 【QOpenGL】摄像机
OpenGL本身没有摄像机(Camera)的概念,但我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机,产生一种我们在移动的感觉,而不是场景在移动。要定义一个摄像机,我们需要它在世界空间中的位置、观察的方向、一个指向它右侧的向量以及一个指向它上方的向量。上面第二张图,可以看出正z轴是从屏幕指向你的,如果我们希望摄像机向后移动,我们就沿着z轴的正方向移动。方法中,无需手动计算,只需要指定摄像机的位置、摄像机朝向的位置以及摄像机的上轴即可,会自动算出右轴和。矩阵,摄像机的位置随着时间绕着。
2025-05-18 23:40:45
621
原创 【QOpenGL】3D练习
本文介绍了三个关于3D渲染的练习题的实现过程。首先,通过调整透视投影中的Fov和ratio参数,探讨了它们如何影响平截头体的形状和渲染范围。其次,通过移动观察矩阵,观察了场景在不同方向上的变化,进一步理解了观察矩阵作为摄像机对象的作用。最后,通过模型矩阵实现了仅让特定箱子旋转的效果,展示了如何通过条件判断控制不同物体的行为。这些练习帮助加深了对3D渲染中关键概念的理解,如平截头体、观察矩阵和模型矩阵的应用。更多相关资料可参考提供的GitHub链接。
2025-05-18 23:38:48
382
原创 【QOpenGL】开始3D
本文介绍了如何使用OpenGL和GLSL实现多个3D正方体的绘制、旋转、位移以及正交投影和透视投影操作。通过定义模型矩阵、视图矩阵和投影矩阵,实现了三维顶点变换。正交投影保持物体大小不变,而透视投影则模拟人眼视角,产生近大远小的效果。文章详细讲解了投影矩阵的设置方法,并提供了顶点数据的准备和GLSL代码实现。最终展示了不同投影方式下的渲染效果,透视投影能够更好地体现场景的深度层次感。
2025-05-18 23:36:01
837
原创 【QOpenGL】缩放、位移与旋转
本文介绍了如何通过OpenGL实现图形的缩放、位移和旋转操作。首先,在顶点着色器中引入uniform类型的矩阵变量mat4,通过矩阵乘法实现顶点坐标的变换。接着,在CPU端使用QMatrix4x4创建矩阵,并通过QElapsedTimer和sin函数实现周期性的缩放和旋转效果。缩放通过scale函数实现,旋转通过rotate函数实现,并结合位移函数translate调整图形位置。最后,文章提供了完整的代码实现,包括顶点着色器、矩阵创建、定时器设置以及周期变化的实现细节。通过这些步骤,成功实现了图形的动态变换
2025-05-18 23:31:15
926
原创 【QOpenGL】纹理练习
本文介绍了四个与纹理相关的OpenGL练习。首先,通过反转顶点着色器中的s坐标,使雪狸图案朝向相反方向。接着,通过修改纹理坐标和设置GL_REPEAT或GL_MIRRORED_REPEAT环绕方式,实现了纹理的重复和镜像效果。然后,通过缩小纹理坐标范围并使用GL_NEAREST过滤方式,展示了单个像素的清晰效果。最后,通过动态调整mix函数的alpha值,实现了两个纹理可见度的动态变化,并通过键盘事件控制其变化。这些练习展示了OpenGL中纹理处理的基本操作和灵活应用。
2025-05-18 23:28:25
400
原创 【QOpenGL】纹理缩放
本文介绍了两种纹理缩放策略的实现:GL_NEAREST(最近邻插值)和GL_LINEAR(双线性插值)。GL_NEAREST通过选择离采样点最近的纹理像素来快速处理纹理,但放大时会产生锯齿状边缘,适合像素艺术风格。GL_LINEAR则通过加权平均周围四个像素的颜色,生成平滑的纹理效果,但可能引入轻微模糊,适合需要高质量视觉效果的场景。文章详细说明了两种策略的原理、特点及实现步骤,并通过代码展示了如何在OpenGL中设置纹理过滤方式,最终对比了两种策略的视觉效果。
2025-05-18 23:26:14
347
原创 【QOpenGL】纹理包裹
文章摘要:本文介绍了如何在OpenGL中设置纹理模式,并在图像边缘添加边框。首先,通过GLSL编写顶点着色器和片段着色器,片段着色器中新增了texture2变量用于接收纹理单元。接着,准备顶点数据,确保纹理坐标稍大于顶点坐标以实现填充效果。在CPU端,通过绑定纹理对象并设置边框颜色,使用原生OpenGL方法或QT封装的方法实现边框效果。最后,提供了整体代码结构,包括头文件和实现文件,展示了如何初始化OpenGL环境、处理顶点数据以及管理纹理对象。
2025-05-18 23:24:51
690
原创 【QOpenGL】纹理texture
本文介绍了如何在OpenGL中实现纹理贴图效果。首先,纹理是贴在3D物体表面的图片,用于增强物体表面的真实感。由于QT坐标系与OpenGL坐标系相反,读取图片后需进行镜像翻转。实现流程包括编写GLSL代码,顶点着色器接收纹理坐标并传递给片段着色器,片段着色器通过texture函数生成片段颜色。纹理计算支持乘法与融合操作。在CPU端,通过QOpenGLTexture管理纹理对象,并在paintGL函数中启用纹理对象。整体代码展示了如何通过顶点数据、着色器程序和纹理对象实现贴图效果。
2025-05-18 23:23:10
1026
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人