- 博客(37)
- 收藏
- 关注
原创 C++常见概念问题(3)
数据类型宏定义:没有特定的数据类型,因为它仅仅是文本替换,编译器在预处理阶段进行替换,不占用内存。全局变量:有具体的数据类型(如整型、浮点型、字符串等),并占用相应的内存空间。定义方式宏定义:使用预处理指令 #define 来定义,通常用来替代常量或表达式。例子:#define PI 3.14全局变量:定义在函数外部作用域都可以在本文件使用。如果跨文件,可以加入extern 关键字在其他文件中使用。
2024-11-11 21:12:41 701
原创 C++智能指针
*因为C++的语言机制保证了,当一个对象创建的时候,自动调用构造函数,当对象超出作用域的时候会自动调用析构函数。所以,在RAII的指导下,我们应该使用类来管理资源,将资源和对象的生命周期绑定。如果在高频率分配内存的情况下,由于系统的内存管理策略,可能会导致内存碎片的增加,进而提高内存溢出的风险。(指针内存和控制块分开创建)这是因为,如果计数器是智能指针类的一部分,那么每次增减计数器的值,都必须广播到每一个管理着目标对象的智能指针。加1,每析构一次,内部的引用计数减1,减为0时,删除所指向的堆内存。
2024-10-24 17:02:17 826
原创 C++数据类型转换
static_cast可以实现 C++中内置基本数据类型之间的相互转换包括各种隐式转换。具体的说,就是用户各种基本数据类型之间的转换,比如把int换成char,float换成int等。派生类(子类)和基类(父类)指针的转换。
2024-10-23 20:01:36 987
原创 数据库一些概念和知识(1)
关系型数据库中的数据是由一张一张的二维关系表所组成,简单的单表查询只需要遍历一个表,而复杂的多表查询需要将多个表连接起来进行查询任务。在更新数据时,会检查版本号或时间戳是否与读取时的值一致,如果不一致,则表示数据已被其他事务修改,当前事务需要回滚。预热热数据:在实际的业务中,某些数据需要频繁访问、查询和更新,这些数据就是热数据,如果直接对mysql数据库查询,会降低数据库的性能。当在数据库表的列上创建索引时,数据库会生成一个或多个索引文件,这些文件包含了索引的元数据和数据结构,比如B树、哈希表或位图等。
2024-10-23 11:43:31 899
原创 HTTP 和 WebSocket
它是Web上信息传递的基础,允许客户端(通常是浏览器)和服务器之间交换文本、图像、视频和其他类型的数据。WSS 是 WebSocket 协议的安全版本,它通过 TLS(传输层安全协议)对数据进行加密,确保在网络上传输的数据不被窃听或篡改。那么问题来了,HTTP是请求一次,响应一次,服务器不能给客户端发送信息。WebSocket 的 Ping-Pong 机制是维持连接稳定性的重要手段,确保双方在长时间不活动的情况下仍然能够保持连接有效性。请求头部包含多个键值对,用于传递客户端的信息和请求的附加参数。
2024-10-08 20:58:21 1431
原创 音视频整体解码流程和同步流程
在完成解码后,调用 avcodec_free_context() 和 avformat_close_input() 释放分配的解码器上下文和媒体文件资源。遍历找到的媒体流,使用 avcodec_find_decoder() 根据流的编码格式查找合适的解码器(如 H.264、AAC 等)。使用av_read_frame() 循环读取数据包,根据DTS时间戳的顺序,分别解码读出来的音频包和视频包。DTS是自己算的,通常情况下,你会基于上一个包的 DTS 和当前包的持续时间来计算当前包的 DTS。
2024-09-26 20:40:04 1043
原创 ffplay源码解析3 读线程_2
ffplay源码解析3 读线程_2经过之前的处理已经找到相应的流信息,并创建相应的解码线程。接下来使用for (;;无限循环来等待和处理事件。
2024-09-26 19:07:03 853
原创 计算机网络的几个概念
2、由服务端回复客户端发送的TCP连接请求报文,其中包含seq序列号,是由服务端随机生成的,并且将SYN置为1,而且会产生ACK字段,ACK字段数值是在客户端发送过来的序列号seq的基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP建立请求已得到验证。2、服务端会回复客户端发送的TCP断开请求报文,其包含seq序列号,是由回复端随机生成的,而且会产生ACK字段,ACK字段数值是在客户端发过来的seq序列号基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP断开请求已经得到验证。
2024-09-24 20:47:05 991
原创 C++常见概念问题(2)
➢ 异常处理过程:在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的函数来解决,上一级解决不了,再传给其上一级,由其上一级处理。如此逐级上传,直到最高一级还无法处理的话,运行系统会自动调用系统函数 terminate,由它调用 abort终止程序。这样的异常处理方法使得异常引发和处理机制分离,而不在同一个函数中处理。这使得底层函数只需要解决实际的任务,而不必过多考虑对异常的处理,而把异常处理的任务交给上一层函数去处理。
2024-09-23 21:27:53 880
原创 ffplay源码解析2 读线程_1
pkt1 是一个 AVPacket 结构体,用于存储解码前的媒体数据包(比如编码的音频帧或视频帧)。pkt 是指向 pkt1 的指针,方便传递数据。stream_start_time 是一个 64 位整数,表示媒体流的开始时间。它通常用来计算播放的时间戳,进行时间同步。pkt_ts 是一个 64 位整数,代表包的时间戳。它可能用于视频帧或音频帧的同步,确保包按照正确的时间顺序解码和播放。pkt_in_play_range 是一个布尔变量(0 或 1),用于判断当前解码的包是否在播放范围内。
2024-09-22 17:57:02 859
原创 ffplay源码解析1 主线程
Flush Packet:在 FFmpeg 中,flush_pkt 常用于刷新缓冲区(flush),特别是在处理完一个流后,发送一个这样的包可以让解码器知道流结束了,并清除其内部缓存。stream_open函数做了很多初始化工作,例如初始化帧队列,初始化时钟,初始化音量,创建读线程。通常,-i 是一个选项,input.mp4是该选项的参数,表示输入文件名。事件循环监控,响应相关的键盘事件(f键,p键,空格等),鼠标事件,窗口事件等。包括对FFmpeg的初始化,对传递的参数进行初始化,SDL的初始化。
2024-09-21 21:34:03 887
原创 C++中异常处理
在C++中,异常处理是一种机制,用于在程序运行时捕获和处理错误条件。异常处理通过抛出异常和捕获异常来实现。下面详细解释C++中异常的实现机制:➢ 异常处理过程:在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的函数来解决,上一级解决不了,再传给其上一级,由其上一级处理。如此逐级上传,直到最高一级还无法处理的话,运行系统会自动调用系统函数 terminate,由它调用 abort终止程序。这样的异常处。
2024-09-10 21:10:07 434
原创 Token和JWT和加密算法
通常直接使用HMAC SHA256(对称加密算法),并且支持多种算法HMAC 是密钥相关的 哈希运算消息认证码(Hash-based Message Authentication Code),HMAC 运算利用 哈希算法 (MD5、SHA1 等),以 一个密钥 和 一个消息 为输入,生成一个 消息摘要 作为 输出。HMAC 发送方 和 接收方 都有的 key 进行计算,而没有这把 key 的第三方,则是 无法计算 出正确的 散列值的,这样就可以 防止数据被篡改。数据摘。
2024-09-08 17:50:14 1156
原创 测试一些概念
需求分析:在这个阶段,测试人员会审查和分析项目的需求文档,以确保他们理解需要测试的功能和特性。制定测试计划:在这个阶段,测试人员会制定一个详细的测试计划,包括测试目标、测试范围、测试资源、测试时间表和风险等。测试设计:在这个阶段,测试人员会根据需求文档和测试计划,设计各种测试用例和测试脚本。环境设置:在这个阶段,测试人员会设置所需的测试环境,包括硬件、软件和网络等。测试执行:在这个阶段,测试人员会按照测试计划和测试用例,执行测试,并记录测试结果。
2024-09-07 20:37:55 634
原创 用hiredis连接redis
Hiredis 是一个用于与 Redis 服务器进行通信的 C 语言库。它提供了一组 API,方便开发者在各种应用场景中实现与 Redis 服务器的数据交互操作。在服务器端的应用中,比如构建 Web 服务或者后端处理程序时,如果需要频繁地与 Redis 进行数据存储、读取、修改等操作,使用 Hiredis 可以提高效率和性能。
2024-09-07 20:27:22 1194
原创 Redis数据持久化方法
如果您需要快速的备份和恢复过程,并且可以接受数据丢失的风险,RDB可能是更好的选择。如果您需要数据的完整性和恢复的灵活性,并且可以容忍较大的磁盘空间占用和可能的恢复时间,AOF可能是更好的选择。
2024-09-07 17:27:13 857
原创 针对IO的并发
IO 操作指的就是数据的输入输出操作;IO 过程可以分为两个步骤:等待 IO 就绪、数据拷贝指进程触发IO操作后会阻塞用户进程,用户等待请求数据到达的过程。指进程触发IO操作后不会阻塞用户进程。,进程触发IO操作是否会阻塞用户进程,用户的cup此时是否释放,所以同步异步针对的是用户进程。指用户进程触发IO操作后,触发read()等待内核将数据copy到用户空间的过程(select 也是一种阻塞IO)。
2024-08-21 21:36:34 607
原创 C++枚举(enum)类型的使用
枚举是一种数据类型,它允许程序员定义一个变量并指定它可以取的那些固定值的集合。C++枚举(enum)类型的使用。用来表示某类事情的结果。
2024-08-19 21:51:03 200
原创 输入URL到页面显示的过程和https加密
同时,服务器会发送一个数字证书(Certificate),证明服务器的身份。如果验证通过,浏览器会生成一个随机数(Pre-master secret),并使用证书中的公钥对其进行加密,发送给服务器。用户的浏览器在后续的请求中会自动将包含 Session ID 的 Cookie 发送回服务器,服务器通过这个 Session ID 来识别用户并恢复其会话状态。生成对称密钥:客户端和服务器使用随机数、证书中的公钥、服务器的私钥等信息,生成一个对称密钥(Session Key),用于对数据进行加密和解密。
2024-07-30 20:27:08 1065
原创 linux嵌入式学习中涉及的一些概念(交叉编译,makefile,GDB)
在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码常见的计算机架构环境有x86架构和arm架构交叉编译链:编译过程包括了预处理、编译、汇编、链接等功能。既然有不同的子功能,那每个子功能都是一个单独的工具来实现,它们合在一起形成了一个完整的工具集。经过交叉编译,使得源文件成为可执行文件编译过程中主要使用gcc编译器,在 Linux 内核的基础上,GNU 计划开发了很多系统部件,GCC 编译器就是其中之一GCC 编译过程详解1)预处理C/C++源文件中,以“ #”开头的命令被称为预处
2024-07-30 20:22:13 755
原创 总结几种设计模式的概念
设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。其目的是为了提高代码的可重用性、代码的可读性和代码的可靠性。
2024-06-16 20:59:07 674
原创 c++语言常见概念问题(1)
程序运行前:代码区:存放函数体的二进制代码,由操作系统进行管理,特点(共享,可读)全局区:存放全局变量和静态变量以及常量,该区域的数据在程序结束后由操作系统释放程序运行后:栈区:由编译器自动分配释放,存放函数的参数值,局部变量等堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。
2024-06-13 21:18:58 687
原创 音视频一些概念
PCM通过对模拟信号进行采样、量化、编码,将连续的模拟信号转换为离散的数字信号,从而实现信号的高保真传输和存储。2.网络带宽限制:网络传输的带宽是有限的,如果直接传输原始音视频数据,可能会导致传输过程中的丢包、延迟增加等问题,影响音视频的实时性和流畅性。原始音视频信号通常会占用较大的带宽和存储空间,而编码后的数据可以通过压缩算法减少数据量,使得传输更加高效。4.保护知识产权:对于某些有版权保护的音视频内容,编码可以应用数字版权管理(DRM)技术,对音视频内容进行加密和保护,防止未经授权的复制和传播。
2024-06-11 13:25:37 888
原创 C++二叉树的一些基础
给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。「好节点」X 定义为:从根到该节点 X 所经过的节点中,没有任何节点的值大于 X 的值。解释:节点 2 -> (3, 3, 2) 不是好节点,因为 “3” 比它大。例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123。输入:root = [3,1,4,3,null,1,5]节点 3 -> (3,1,3) 是路径中的最大值。
2024-06-11 13:25:01 714
原创 ffmpeg摄像头和桌面录制
录制桌面出错Could not find output pin from video capture device.video=screen-capture-recorder: I/O error 还没解决。
2024-05-26 20:02:20 329
原创 c++常用函数
int不超过10个数字,long long int不超过19个数字。C++中常量INT_MAX和INT_MIN分别表示最大、最小整数。2.读取int数据,遇到空格可以跳过继续读,遇到其他字符如%停止。3.按顺序读取不同类型数据。除了大写字母其余不做修改。
2024-05-26 16:40:16 1030
原创 C++中的链表基础
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。输入:l1 = [1,2,4], l2 = [1,3,4]输入:l1 = [], l2 = [0]输入:l1 = [], l2 = []输出:[1,1,2,3,4,4]
2024-05-20 22:02:24 514
原创 RTSP流媒体服务器的TCP(soket)通信(win系统)
include //标准输入输出的头文件#include //标准库函数的头文件#include //标准整型数据类型的头文件#include //和下面两个文件和文件描述符处理的头文件#include //和下面一个 ,Windows 下网络编程的头文件#include //Windows API 的头文件#pragmacomment。
2024-05-18 16:39:33 650
原创 605种花问题
给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。输入:flowerbed = [1,0,0,0,1], n = 1。输入:flowerbed = [1,0,0,0,1], n = 2。第一,局部两端已经种花,在间隔能种多少。这种方法虚拟空位 + 滑动窗口。
2024-05-11 18:14:31 198
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人