自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(55)
  • 收藏
  • 关注

原创 11 - FFmpeg - 编码 AAC

其中AAC解码输出的数据为浮点型的 AV_SAMPLE_FMT_FLTP 格式,MP3 解码输出的数据为 AV_SAMPLE_FMT_S16P 格式(使用的mp3文件为16位深)。具体采样格式可以査看解码后的 AVframe 中的 format 成员或解码器的AVCodecContext中的sample_fmt成员。Planar 模式是 ffmpeg内部存储模式,我们实际使用的音频文件都是Packed模式的。编码器通常的冲洗方法:调用一次 avcodec_send_frame(NULL)(返回成功),

2024-07-22 17:18:06 62

原创 10 - FFmpeg - 重采样 - SoftwareResampleExample

常用的音频采样频率有8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz等,如果采用更高的采样频率,还可以达到DVD的音质。2)帧率(Frame rate):是用于测量显示帧数的量度。左声道的数据存储在data[0],右声道的数据存储在data[1],每个声道的所占用的字节数为linesize[0]和linesize[1];如果该音频帧是FLTP格式的PCM数据,包含1024个样本,双声道,那么该音频帧包含的音频数据量是2*1024*4=8192字节。

2024-07-18 13:20:38 679

原创 09 - AVIO - 最简单的自定义IO - [aac提取pcm]

在自定义协议的时候,提取连续的媒体数据

2024-07-15 16:42:13 82

原创 08 - FFmpeg - 解封装 - 提取 h264 + AAC

【代码】08 - FFmpeg - 解封装 - 提取 h264 + AAC。

2024-07-12 15:23:17 321

原创 07 - FFmpeg 更改视频分辨率 - 保存 yuv420p

--------------------------------------------------------------- 更改视频格式流程 ----------------------------------------------------------------4、av_image_get_buffer_size -- 共创建多少字节的空间。解码后的数据存储在data[0]、data[1]、data[2]中,3、av_frame_alloc -- 图像转换后的数据需要存储起来。

2024-07-11 16:40:12 431

原创 06 - FFmpeg 提取 YUV420P 视频裸数据

YUV422:一张4x4像素的YUV422图像大小为4x4x2=32字节,Y分量为全采样,即 4x4=16字节,U分量和V分量只有Y分量的一半,即U分量为4x4/2=8字节,V分量也是4x4/2=8字节。YUV420:一张4x4像素的YUV420图像大小为4x4x(3/2)=24字节,Y分量为全采样,即4x4=16字节,U分量和V分量只有Y分量的四分之一,即U分量和V分量的大小4x4/4=4字节。· 把亮度和色度分离,没有色度信息仍能显示完整的图像,只不过是黑白的,解决彩色电视跟黑白电视的兼容问题。

2024-07-11 16:18:32 754

原创 05 - FFmpeg 提取 PCM 音频裸数据

---------------------------------------------------------------- PCM计算 -----------------------------------------------------------------人耳能接受的频率范围为20Hz~20kHz,故采样率一般为44.1KHz较好,采样率越高,质量越高,但存储空间增大。· 大小计算:以CD的音质为例:量化格式为16比特(2字节),采样率为44100,声道数为2。

2024-07-11 13:37:53 515

原创 04 - FFmpeg 提取 H264 数据 -- Annexb

---------------------------------------------------------------- H.264 帧的分类 -----------------------------------------------------------------其核心作用是,是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。

2024-07-05 14:32:53 424

原创 03 - FFmpeg 提取 AAC 数据

FFmpeg 提取 AAC 数据

2024-07-04 14:40:20 893

原创 02 - FFmpeg 查看媒体文件信息

FFmpeg 查看媒体文件信息

2024-07-03 17:10:19 314

原创 01 - FFmpeg 内存模型

FFmpeg -- AVPacket 与 AVFrame

2024-07-02 14:40:08 643

原创 06-SDL播放音频PCM

本程序使用SDL2播放PCM音频采样数据。SDL实际上是对底层绘图API(Direct3D,openGL)的封装,使用起来明显简单于直接调用底层API。测试的PCM数据采用采样率44.1k,采用精度S16SYS,通道数2

2024-06-26 13:44:41 256

原创 05-SDL YUV显示:SDL视频显示的流程

YUV显示:SDL视频显示的流程

2024-06-26 10:22:42 175

原创 04-SDL线程

SDL线程

2024-06-25 16:11:00 101

原创 03-SDL 事件

SDL 事件

2024-06-25 15:24:37 138

原创 02-SDL SDL视频显示函数简介

视频显示函数简介

2024-06-25 14:43:30 232

原创 01-SDL子系统

sdl lesson

2024-06-25 14:24:00 166

原创 C++ 数据类型

大部分情况下,这三种方式(花括号表示法、函数表示法和赋值表示法)是等效的。但当发生缩窄转换(namowing conversion)时,初始化列表形式要稍微安全一些。缩窄转换会把值转换为一种取值范围更窄的类型,因此这种 转换可能丢失信息。采用初始化列表的方式是C++11引入的新的语法 提高了安全性。这两种方式都是初始化0。

2023-08-26 17:19:56 104

原创 LinuxC 线程 -- 条件变量

多线程配合工作时,当线程检测到某条件不满足时就休眠,直到别的线程将条件准备好,然后通过条件变量将其唤醒。主线程对va变量循环+1,次线程发现va==5时,打印va的值并将va清0,如果va的值!1、定义一个条件变量(全局变量)由于条件变量需要互斥锁的配合,所以还需要定义一个线程互斥锁。条件变量需要在互斥锁的配合下才能工作。4、删除条件变量,也需要把互斥锁删除。

2023-08-06 10:23:25 181

原创 LinuxC 线程 -- 信号量

有四个进程1、2、3、4。线程1的功能就是输出A,线程2的功能就是输出B,以此类推.........现在有四个文件ABCD。

2023-08-05 22:22:50 96

原创 LinuxC 进程间通信 --- 信号量

有四个进程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。信号量其实是OS创建的一个共享变量,进程在进行操作之前,会先检查这个变量的值,这变量的值就是一个标记,通过这个标记就可以知道可不可以操作,以实现互斥。1、进程调用semget函数创建新的信号量集合,或者获取已有的信号量集合。3、调用semop函数,对集合中的信号量进行pv操作(加锁解锁)有多少个进程需要同步,我们在集合中就需要创建对应数量的信号量。4、调用semctl删除信号量集合。

2023-08-05 17:01:53 189

原创 LinuxC 进程间通信 --- 共享内存

让同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新;2、直接使用地址来读写缓存时,效率会更高,适用于大数据量的通信。2、进程调用shmat函数,将物理内存映射到自己的进程空间。1、进程调用shmget函数创建新的或获取已有共享内存。4、调用shmctl函数释放开辟的那片物理内存空间。3、shmdt函数,取消映射。1、减少进入内核空间的次数。

2023-08-05 15:27:41 164

原创 LinuxC 进程间通信 --- 消息队列

消息队列的本质就是由内核创建的用于存放消息的链表,由于是存放消息的,所以我们就把这个链表称为消息队列。2、多进程网状交叉通信时,消息队列是上上之选。3、能实现大规模数据的通信。1、传送有格式的消息流。

2023-08-05 10:42:17 388 1

原创 LinuxC 进程间通信 --- 管道

这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,通过FIFO不相关的进程也能交换数据。1、写管道时,如果管道的读端被close了话,向管道“写”数据的进程会被内核发送一个SIGPIPE信号, 发这个信号的目的就是想通知你,管道所有的“读”都被关闭了。1、为了保证管道一定被创建,最好是两个进程都包含创建管道的代码,谁先运行就谁先创建,后运行的发现管道已经创建好了,那就直接open打开使用。

2023-08-04 20:31:35 63

原创 LinuxC 进程间通信 --- 信号

2、设置SIGIO信号由哪个进程接收。信号 -- 实现异步IO操作。1、设置信号的处理函数。3、设置可以异步读取。

2023-08-04 17:28:51 50

原创 LinuxC 进程

用两个进程实现一个读鼠标一个读键盘demo。

2023-08-04 15:38:22 40

原创 LinuxC 网络 -- TCP(C/S)IO多路转接(epoll)demo

epoll工作在ET模式的时候,必须使用非阻塞套接口,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。epoll维护的树在共享内存中,内核区和用户区去操作共享内存,因此不需要区域转换,也不需要拷贝操作。1、ET模式(边缘触发)只有数据到来才触发,不管缓存区中是否还有数据,缓冲区剩余未读尽的数据不会导致epoll_wait返回;2、边缘触发需要一次性的把缓冲区的数据读完为止,也就是一直读,直到读到EGAIN(EGAIN说明缓冲区已经空了)为止。3、边缘触发需要设置文件句柄为非阻塞。

2023-08-03 14:29:00 90

原创 LinuxC 网络 -- TCP(C/S)IO多路转接(poll)demo

【代码】LinuxC 网络 -- TCP(C/S)IO多路转接(poll)demo。

2023-08-03 11:18:19 78

原创 LinuxC 网络 -- TCP(C/S)IO多路转接(select)demo

【代码】LinuxC 网络 -- TCP(C/S)IO多路转接(select)demo。

2023-08-03 11:08:50 76

原创 LinuxC 网络 -- TCP(C/S)多线程服务器demo

阻塞式IO + 多线程:每来一个客户端创建一个线程。

2023-08-03 10:59:16 92

原创 线程池(C \ C++)--- 可伸缩式线程池

线程池会根据当前的线程数量和任务队列的情况,决定是将任务分配给已有的线程还是创建新的线程来处理任务。总之,可伸缩线程池的实现原理主要包括线程池的创建和初始化、任务的提交和处理、线程的管理和调度、动态调整线程数量以及错误处理和资源回收等方面,通过合理地管理线程和任务,以提高系统的并发性能和资源利用率。线程的管理和调度:线程池需要维护一个线程池管理结构,用于记录线程的状态和相关信息。线程池的创建和初始化:在创建线程池时,需要指定线程池的初始大小和最大大小。上述来源于chatGBT。

2023-08-03 10:29:52 167

原创 LinuxC 网络 -- TCP(C/S)多进程服务器demo

阻塞式IO + 多进程:每来一个客户端创建一个进程。

2023-07-31 21:13:24 127

原创 LinuxC 网络 -- TCP(C/S)循环服务器demo

【代码】LinuxC 网络 -- TCP(C/S)循环服务器demo。

2023-07-31 20:46:28 84

原创 LinuxC 网络 -- TCP(C/S)demo

同一时间只能响应一个客户端的请求,将小写字母转换成大写字母。在中间客户端发送数据时候会发生阻塞,无法响应其他客户端。中间客户端下线之后,右端收到消息。

2023-07-31 20:30:19 159

原创 08、LinuxC -- IO多路复用 poll函数

这个数组就相当于select的文件描述符集合,只不过select是使用fd_set来定义的,而poll的集合是一个数组。如果文件描述符“发生的事件”==“实际事件”,就说明希望的事件来了,就是对fd进行相应的“读或写”操作。监听集合没无动静,如果没有动静就阻塞,如果有动静就成功返回,返回值为集合中有动静的fd的数量。因为无法获取具体哪个文件描述符发生变化,只能进行全盘轮询,随着监听的文件描述符增多,效率下降;poll 监听时如果没有动静就阻塞,有动静就不再阻塞,返回有动静的fd的数量。

2023-07-31 16:36:19 119

原创 07、LinuxC -- IO多路复用 select函数

2、因为无法获取具体哪个文件描述符发生变化,只能进行全盘轮询,随着监听的文件描述符增多,效率下降;3、所监听的文件描述符都必须从用户空间传入内核空间进行监听,涉及到大量的数据拷贝,效率低;1、采用数组的方式保存监听的文件描述符,由于数组的空间分配方式(静态分配),个数受限;在调用select后使用FD_ISSET来检测文件描述符集fdset中的文件fd发生了变化。宏FD_ SET将文件描述符fd添加到文件描述符集fdset中;maxfd:文件描述符的范围,比待检的最大文件描述符大1。

2023-07-31 16:06:25 88 1

原创 06、LinuxC -- 系统调用 fcntl函数

4.获得/设置异步 I/O 所有权(cmd=F_GETOWN 或 F_SETOWN).5.获得/设置记录锁(cmd=F_GETLK,F_SETLK 或 F_SETLKW)第三步:写:将改后的标志位设置回去 fcntl(0,F_SETFL,flags);第一步:读,获取之前的标志位:flags = fcntl(0,F_GETFL);2.获得/设置文件描述符标记(cmd=F_GETFD 或 F_SETFD).3.获得/设置文件状态标记(cmd=F_GETFL 或 F_SETFL).fd:目标文件描述符。

2023-07-31 11:13:59 123 1

原创 05、LinuxC -- 系统调用 mmap函数 存储映射

内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。将一个普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存读写取代I/O读写,以获得较高的性能;调用成功,返回映射的起始虚拟地址,失败则返回(void*)NULL,errno被设置。

2023-07-31 10:29:47 201 1

原创 04、LinuxC -- 系统调用 wirte,read,lseek函数

通过系统调用 读一行写一行 实现文件拷贝 demo

2023-07-30 21:08:19 258 1

原创 数据结构(C语言)-- 线索二叉树

有 2n 个指针,2n - (n - 1) = n + 1 个指针没有用。* 利用这个n + 1个指针,来指向我们二叉树遍历序列当中的前驱和后继。先序线索二叉树:是指如果节点没有左右孩子,则指针指向先序遍历的前驱和后继。* 线性结构有前驱有后继。我们使用线索将二叉树转换成类似的线性结构。* 如果一个二叉树有 n 个节点,那么有多少个指针指向这些节点?线索其实就是将节点连在一起的指针;* 有 n-1 个指针指向他们。* 一共有多少个指针?* 左 --> 前驱。* 右 --> 后继。

2023-07-30 20:38:25 494 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除