- 博客(60)
- 收藏
- 关注
原创 16 - FFmpeg 视频过滤器 方式2
这里 overlay 的参数 0:H/2 表示将 [flip] 流放置在原始视频的下半部分,0 是 x 轴的偏移量,H/2 是 y 轴的偏移量,表示将翻转后的流叠加在原始流的下方。* [main][flip]overlay=0:H/2:将 [main] 流(未裁剪的原始视频)和 [flip] 流(翻转后的一半视频)叠加。* split[main][tmp]:这个滤镜将输入视频流分成两个相同的流,分别标记为 [main] 和 [tmp]。代码等效密令【测试用】
2024-08-28 17:20:01
638
原创 15 - FFmpeg 音频混音(过滤器)
dropout_transition=3 则是指定在音频丢失时的过渡时间(单位为秒)。这里设置为3秒,表示在一个音频渐渐退场时,会持续这样的过渡时间。* -filter_complex:这个参数表示使用一个复杂的过滤器。* longest 表示混合的持续时间将取两个音频文件中较长的那个。* complex 表示我们将要应用一个比简单过滤器更复杂的操作。* dropout_transition=3:这是一个过渡参数。* amix 是一个用于音频混合的过滤器。封装一个AudioMIxer。
2024-08-27 13:48:59
1094
原创 14 - FFmpeg 过滤器 [视频]
对于 tmp 流,先经过 crop 滤波器进行裁剪处理,再经过 flip 滤波器进行垂直方向上的翻转操作,输出的结果命名为 flip 流。这个例子的处理流程如上所示,首先使用 split 滤波器将 input 流分成两路流(main和tmp),然后分别对两路流进行处理。上图的 input 就是上面提过的 buffer 源滤波器 output 就是上面的提过的 buffersink 滤波器。再将 main 流和 flip 流输入到 overlay 滤波器进行合成操作。
2024-08-20 14:53:10
496
原创 13 - FFmpeg 封装 MP4
AV_SAMPLE_FMT_S16格式的PCM数据是两个声道交替存储,每个样点占用2个字节,而FFmpeg的AAC编码器需要PCM数据以平面存储格式(AV_SAMPLE_FMT_FLTP)提供,其中样点为float类型,且每个声道单独存储。这种格式转换(重采样)是为了适应编码器的输入要求,确保音频数据能够被正确编码成AAC格式。例如,有些声音设备只能播放特定采样率和采样格式的音频数据,如果音频数据的格式与设备要求不匹配,就需要进行重采样以适应设备的播放要求。
2024-08-16 15:39:20
813
原创 12 - FFmpeg 编码 H264
--------------------------- 视频编码 -------------------------------------------------------- 编码流程 ----------------------------1、查找编码器 --- avcodec_find_encoder_by_name。5、读取yuv数据 --- av_image_get_buffer_size。3、设置编码参数 --- avcode_open2。-b:v 指定视频平均码率。-bf 指定B帧数目。
2024-07-30 10:32:05
656
原创 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
496
1
原创 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
972
原创 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
803
原创 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
1045
原创 05 - FFmpeg 提取 PCM 音频裸数据
---------------------------------------------------------------- PCM计算 -----------------------------------------------------------------人耳能接受的频率范围为20Hz~20kHz,故采样率一般为44.1KHz较好,采样率越高,质量越高,但存储空间增大。· 大小计算:以CD的音质为例:量化格式为16比特(2字节),采样率为44100,声道数为2。
2024-07-11 13:37:53
678
原创 04 - FFmpeg 提取 H264 数据 -- Annexb
---------------------------------------------------------------- H.264 帧的分类 -----------------------------------------------------------------其核心作用是,是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。
2024-07-05 14:32:53
708
原创 06-SDL播放音频PCM
本程序使用SDL2播放PCM音频采样数据。SDL实际上是对底层绘图API(Direct3D,openGL)的封装,使用起来明显简单于直接调用底层API。测试的PCM数据采用采样率44.1k,采用精度S16SYS,通道数2
2024-06-26 13:44:41
340
原创 C++ 数据类型
大部分情况下,这三种方式(花括号表示法、函数表示法和赋值表示法)是等效的。但当发生缩窄转换(namowing conversion)时,初始化列表形式要稍微安全一些。缩窄转换会把值转换为一种取值范围更窄的类型,因此这种 转换可能丢失信息。采用初始化列表的方式是C++11引入的新的语法 提高了安全性。这两种方式都是初始化0。
2023-08-26 17:19:56
153
原创 LinuxC 线程 -- 条件变量
多线程配合工作时,当线程检测到某条件不满足时就休眠,直到别的线程将条件准备好,然后通过条件变量将其唤醒。主线程对va变量循环+1,次线程发现va==5时,打印va的值并将va清0,如果va的值!1、定义一个条件变量(全局变量)由于条件变量需要互斥锁的配合,所以还需要定义一个线程互斥锁。条件变量需要在互斥锁的配合下才能工作。4、删除条件变量,也需要把互斥锁删除。
2023-08-06 10:23:25
258
原创 LinuxC 线程 -- 信号量
有四个进程1、2、3、4。线程1的功能就是输出A,线程2的功能就是输出B,以此类推.........现在有四个文件ABCD。
2023-08-05 22:22:50
169
原创 LinuxC 进程间通信 --- 信号量
有四个进程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。信号量其实是OS创建的一个共享变量,进程在进行操作之前,会先检查这个变量的值,这变量的值就是一个标记,通过这个标记就可以知道可不可以操作,以实现互斥。1、进程调用semget函数创建新的信号量集合,或者获取已有的信号量集合。3、调用semop函数,对集合中的信号量进行pv操作(加锁解锁)有多少个进程需要同步,我们在集合中就需要创建对应数量的信号量。4、调用semctl删除信号量集合。
2023-08-05 17:01:53
274
原创 LinuxC 进程间通信 --- 共享内存
让同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新;2、直接使用地址来读写缓存时,效率会更高,适用于大数据量的通信。2、进程调用shmat函数,将物理内存映射到自己的进程空间。1、进程调用shmget函数创建新的或获取已有共享内存。4、调用shmctl函数释放开辟的那片物理内存空间。3、shmdt函数,取消映射。1、减少进入内核空间的次数。
2023-08-05 15:27:41
278
原创 LinuxC 进程间通信 --- 消息队列
消息队列的本质就是由内核创建的用于存放消息的链表,由于是存放消息的,所以我们就把这个链表称为消息队列。2、多进程网状交叉通信时,消息队列是上上之选。3、能实现大规模数据的通信。1、传送有格式的消息流。
2023-08-05 10:42:17
480
1
原创 LinuxC 进程间通信 --- 管道
这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,通过FIFO不相关的进程也能交换数据。1、写管道时,如果管道的读端被close了话,向管道“写”数据的进程会被内核发送一个SIGPIPE信号, 发这个信号的目的就是想通知你,管道所有的“读”都被关闭了。1、为了保证管道一定被创建,最好是两个进程都包含创建管道的代码,谁先运行就谁先创建,后运行的发现管道已经创建好了,那就直接open打开使用。
2023-08-04 20:31:35
121
原创 LinuxC 进程间通信 --- 信号
2、设置SIGIO信号由哪个进程接收。信号 -- 实现异步IO操作。1、设置信号的处理函数。3、设置可以异步读取。
2023-08-04 17:28:51
86
原创 LinuxC 网络 -- TCP(C/S)IO多路转接(epoll)demo
epoll工作在ET模式的时候,必须使用非阻塞套接口,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。epoll维护的树在共享内存中,内核区和用户区去操作共享内存,因此不需要区域转换,也不需要拷贝操作。1、ET模式(边缘触发)只有数据到来才触发,不管缓存区中是否还有数据,缓冲区剩余未读尽的数据不会导致epoll_wait返回;2、边缘触发需要一次性的把缓冲区的数据读完为止,也就是一直读,直到读到EGAIN(EGAIN说明缓冲区已经空了)为止。3、边缘触发需要设置文件句柄为非阻塞。
2023-08-03 14:29:00
149
原创 LinuxC 网络 -- TCP(C/S)IO多路转接(poll)demo
【代码】LinuxC 网络 -- TCP(C/S)IO多路转接(poll)demo。
2023-08-03 11:18:19
132
原创 LinuxC 网络 -- TCP(C/S)IO多路转接(select)demo
【代码】LinuxC 网络 -- TCP(C/S)IO多路转接(select)demo。
2023-08-03 11:08:50
131
原创 线程池(C \ C++)--- 可伸缩式线程池
线程池会根据当前的线程数量和任务队列的情况,决定是将任务分配给已有的线程还是创建新的线程来处理任务。总之,可伸缩线程池的实现原理主要包括线程池的创建和初始化、任务的提交和处理、线程的管理和调度、动态调整线程数量以及错误处理和资源回收等方面,通过合理地管理线程和任务,以提高系统的并发性能和资源利用率。线程的管理和调度:线程池需要维护一个线程池管理结构,用于记录线程的状态和相关信息。线程池的创建和初始化:在创建线程池时,需要指定线程池的初始大小和最大大小。上述来源于chatGBT。
2023-08-03 10:29:52
295
原创 LinuxC 网络 -- TCP(C/S)demo
同一时间只能响应一个客户端的请求,将小写字母转换成大写字母。在中间客户端发送数据时候会发生阻塞,无法响应其他客户端。中间客户端下线之后,右端收到消息。
2023-07-31 20:30:19
223
原创 08、LinuxC -- IO多路复用 poll函数
这个数组就相当于select的文件描述符集合,只不过select是使用fd_set来定义的,而poll的集合是一个数组。如果文件描述符“发生的事件”==“实际事件”,就说明希望的事件来了,就是对fd进行相应的“读或写”操作。监听集合没无动静,如果没有动静就阻塞,如果有动静就成功返回,返回值为集合中有动静的fd的数量。因为无法获取具体哪个文件描述符发生变化,只能进行全盘轮询,随着监听的文件描述符增多,效率下降;poll 监听时如果没有动静就阻塞,有动静就不再阻塞,返回有动静的fd的数量。
2023-07-31 16:36:19
175
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人