- 博客(75)
- 资源 (2)
- 收藏
- 关注
原创 libevent源码剖析-基本数据结构
前面系列文章对libevent源码的主体结构,从reactor框架实现,到evbuffer和bufferevent实现原理,及libevent的例子进行了剖析,自此,我们便可基于libevent开发app了。 从本文开始,主要来介绍下libevent源码的枝叶部分,包括数据结构、C开发技巧、工具函数等。本文从数据结构开始介绍。 单链表相关操作都在libevent源码根目录compat/sys/queue.h文件下。这里简要介绍下单链表原理及其操作。2.1.2 访问方法2.1.3
2024-10-29 16:42:46
1100
原创 libevent源码剖析-evconnlistener
evconnlistener 是 libevent 提供的一个用于处理传入连接的接口。它可以简化监听套接字的处理,使用户能够方便地在事件循环中接收客户端连接,并为每个新连接创建事件。 其主要功能如下: 定义:1.1.2 evconnlistener_free 定义:1.1.3 evconnlistener_set_error_cb 定义: 功能: 设置错误回调函数,当发生错误时调用该回调。 以下是一个使用 evconnlistener 的简单 TCP 服务端
2024-10-25 11:38:08
988
原创 libevent源码剖析-event
在类unix系统中编写网络程序时,我们经常需要处理3类事件-IO事件&signal事件&timer事件,libevent通过reactor来注册&调度&处理IO事件,并且也将signal和timer事件借助socket() / accept()/ socketpair()/ eventfd() / pipe() / pipe2() / timer_createfd()等系统调用,巧妙的将各平台的signal事件和timer事件,融入到了libevent的reactor框架中。程序员只需要利用几个简易的a
2024-10-21 16:08:07
924
原创 libevent源码剖析-开篇
关于,曾在项目中直接或间接使用过,开源的便是对的c++封装,窃以为简单好用,但裸用的话本人在最近开源的缓存库里使用过,感受是比较累。累的原因,一则是C语言所写,一则是对源码还不够熟,踩坑较多。因此,从本文开始,拟对写系列文章,目的是通过对的源码分析,来加深理解。后文均基于版本来剖析。
2024-10-14 15:24:20
1145
原创 libevent源码剖析之http
libevent 的 HTTP 框架提供了一种轻量级、异步的方式来处理 HTTP 请求和响应,广泛用于编写简单的或其他与 HTTP 协议相关的程序。它构建在 libevent 的事件机制之上,并充分利用了事件驱动和异步 I/O 的优势,能够高效地处理高并发的 HTTP 请求。
2024-10-14 11:58:21
1444
1
原创 libevent源码剖析之bufferevent
是 libevent 中提供的一种,建立在之上,用于管理带缓冲。它简化了异步 I/O 的管理,使得开发者在处理网络数据时可以更加方便地进行读取、写入和处理错误。bufferevent 背后通过结合以及,形成一个结构化的 I/O 流管理方式。
2024-10-14 11:57:40
1112
原创 libevent源码剖析之evbuffer
是 libevent 提供的一个动态缓冲区,用于高效地管理和处理 I/O 数据流。在网络编程中非常有用,特别是在处理异步 I/O 和流式数据时。它抽象出了数据的读写缓冲区,实现了灵活的数据存储与管理机制,同时避免了频繁的内存拷贝操作。不连续():创建一个新的 evbuffer 缓冲区。():释放缓冲区。():向缓冲区追加数据。():从缓冲区中移除数据。():将一个的内容追加到中。():从文件描述符或读取数据到缓冲区。():将缓冲区中的数据写到文件描述符或。
2024-10-14 11:57:08
830
原创 libevent源码剖析之reactor
是一种事件驱动的并发处理模式,常用于网络服务器和事件循环系统中。它主要的功能是通过或者处理I/O操作,避免阻塞,并且能够高效处理的事件。,以下摘自原文:Theis ansingleor, whichforand:系统中会有多个事件源,例如网络套接字、文件描述符、定时器等,触发各种事件,如读、写、超时等。:事件分离器(通常是系统调用,如select(), poll(), 或epoll())负责监控这些事件源,并将发生事件的事件源标记出来。
2024-10-14 11:56:37
1108
原创 libevent源码剖析之iocp
I/O Completion Ports (IOCP) 是 Windows 上的一种高效 I/O 多路复用机制,用于处理大量并发连接和 I/O 操作。与 select、poll 等机制不同,IOCP 采用了和来高效地处理异步 I/O 操作。:IOCP 允许程序在执行 I/O 操作时不阻塞主线程,I/O 操作会在后台进行,完成后通过完成端口通知主线程。:IOCP 使用线程池来处理并发 I/O 事件,根据负载动态分配工作线程,从而最大化 CPU 和 I/O 资源的利用。
2024-10-14 11:56:03
999
原创 libevent源码剖析之epoll
epoll 是 Linux 提供的一种高效的多路复用机制,用于处理大量并发连接时的 I/O 事件。与传统的 select 和 poll 相比,epoll 的性能大幅提高,尤其在监控时具有显著优势。:epoll 采用事件驱动模式(edge-triggered 和 level-triggered),只在文件描述符的状态发生变化时才通知应用程序,而不像 select 和 poll 需要每次调用时轮询所有文件描述符。
2024-10-14 11:55:31
974
原创 libevent源码剖析之poll
poll 多路复用是与 select 类似的系统调用,用于监控多个文件描述符上的 I/O 操作,允许程序同时等待多个事件(如可读、可写、或异常)。与 select 相比,,并提供了更灵活的接口。,适用于高并发场景。:poll 可以监控任意数量的文件描述符(不限于 select 的 1024 个限制)。:程序调用 poll,阻塞等待指定的文件描述符变为就绪状态(如可读、可写或出现异常)。:一旦文件描述符有事件发生,poll 返回,程序可以处理这些事件。
2024-10-14 11:54:57
913
原创 libevent源码剖析之select
select 多路复用是一种用于监视多个文件描述符(如网络套接字、文件等)的 I/O 操作状态的系统调用。通过 select,程序可以同时等待多个 I/O 操作的就绪(如读、写或异常事件),从而避免为每个 I/O 操作创建独立的线程或进程。 select 最常用于高并发场景下的事件驱动编程,例如网络服务器或实时通信系统。通过 select,应用可以一次性监视大量连接,处理 I/O 操作时不会阻塞。 select 多路复用的原理,是通过轮询所关注的fd的IO事件是否就绪的,而且所支持的最大fd有上
2024-10-14 11:54:28
794
原创 开源一个C缓存库
在当下的视频点播应用场景下,端侧对视频缓存的需求可谓刚需,一方面可以为公司节省流量成本,一方面也可以提升用户的播放体验,有一石二鸟之效。近期,本人用C写了一个缓存库,支持系统平台,并在以上3个平台充分自测过,,开箱即用。
2024-10-09 10:41:43
731
原创 libevent之android与鸿蒙编译过程
最近基于libevent开发了一个端侧的缓存代理库,先是基于macOS编译开发的,基本0问题,后来移植到鸿蒙与android时遇到一些编译链接问题。
2024-08-17 09:51:24
1341
原创 一个引发openssl崩溃问题案例
最近用libevent写了一个https代理功能,在调研的时候,遇到了一个项目用到了本地多个openssl库引发的ssl握手崩溃问题。
2024-07-15 16:40:48
786
原创 使用gtest做cpp的单元测试并查看代码覆盖率
由于工作需要,要使用googletest做单元测试,本文记录下搭建gtest单元测试环境,并查看代码覆盖率的方法,以备不时之需。
2024-06-15 15:11:29
1851
原创 macOS上用Qt creator编译并跑shotcut
Shotcut是一个跨平台的视频编辑软件,支持WINMACOSLINUX等平台,由于该项目的编译较为麻烦,写此文章记录完整编译构建过程,后续按此法编译,可减少走弯路,提高生产力。
2024-05-28 20:47:12
1421
原创 macOS上编译android的ffmpeg及ffmpeg.c
前段时间介绍过使用xcode和qt creator编译调试ffmepg.c,运行平台是在macOS上,本文拟介绍下android平台如何用NDK编译链编译ffmepg库并使用。macOS上使用qt creator编译调试ffmpeg.cmacOS上将ffmpeg.c编译成Framework其一,分别介绍使用GCC和CLang编译器来编译ffmpeg库的方法;其二,介绍如何将ffmpeg的多个so库打包成1个so库之法;
2024-05-27 16:41:26
1143
原创 IJKPLAYER误配nobuffer选项增加首开时间案例
在使用IJKPLAYER二开时,为了降低直播时延,使能了的选项,该选项也是所支持的。自测发现,该选项对直播时延的确有一定帮助,但会增加首开时间。本文记录下此次踩坑经历。
2024-05-16 23:54:40
984
原创 macOS上使用qt creator编译调试ffmpeg.c
上文macOS上将ffmpeg.c编译成Framework介绍了使用xocde将ffmpeg.c编译成Framework的方法,这里列举另外一种办法,就是用qt creator来完成这件事情。
2024-05-14 12:12:42
866
原创 macOS上将ffmpeg.c编译成Framework
本文介绍下在macOS上将ffmpeg的目录下的程序,也就是ffmpeg的命令行程序,编译成的方法。编译成.a或.dylib亦是类似。
2024-05-11 11:11:17
1027
原创 IJKPLAYER源码分析-总体概述
pipeline是在分析了软硬解及跨平台视频decoder的创建、配置及初始化与音频的跨平台输出共性,从而抽象出来的接口;pipeline定义了配置、初始化和创建视频decoder的接口(包括FFmpeg软解及对应平台硬解decoder),及创建SDL_Aout实例的接口;音频decoder的创建、配置及初始化,则是在SDL_Aout接口里定义;
2024-04-15 11:19:19
1269
原创 IJKPLAYER源码分析-iOS端显示
OpenGL ES 通过 CAEAGLLayer 与 Core Animation 连接,CAEAGLLayer 是一种特殊类型的 Core Animation 图层,它的内容来自 OpenGL ES 的 RenderBuffer,Core Animation 将 RenderBuffer 的内容与其他图层合成,并在屏幕上显示生成的图像。所以,videotoolbox硬解后的像素数据来源也清楚了,来自AVFrame的opaque,实际是CVPixelBuffer。iOS端显示的主函数,是在iOS端。
2024-04-06 15:18:25
472
原创 IJKPLAYER源码分析-Android端显示
上文分析了OpenGL ES渲染的实现。本文边可以分析video画面是如何在Android端窗口上显示的了。
2024-04-06 15:17:54
342
原创 IJKPLAYER源码分析-AudioQueue播放
IJKPLAYER实现了AudioQueue和AudioUnit播放PCM音频的功能,但当前使用的是AudioQueue来播放PCM音频。因此,本文来只介绍AudioQueue播放PCM的实现。关于AudioQueue官方文档,请参见。
2024-04-06 15:14:37
271
原创 IJKPLAYER源码分析-OpenSL ES播放
与IJKPLAYER处理AudioTrack播放类似,OpenSL ES的接入需要满足SDL_Aout的接口规范,所不同的是OpenSL ES播放是在native完成的,调用的是NDK接口OpenSL ES的播放能力。关于OpenSL ES的详细介绍,请参考官方文档一文。Pipeline及SDL_Aout结构体及相关创建,与AudioTrack一致,请参考前文。
2024-04-06 15:14:02
711
原创 IJKPLAYER源码分析-AudioTrack播放
AudioTrack是Android SDK所提供的播放PCM音频的技术,IJKPLAYER对此使用的以native层反射到Java层的播放能力。
2024-04-06 15:13:27
448
原创 IJKPLAYER源码分析-videotoolbox硬解
是一个底层框架,提供对硬件编码器和解码器的直接访问。它提供视频压缩和解压缩服务,以及存储在CoreVideo像素缓冲区中的光栅图像格式之间的转换服务。这些服务以会话对象(压缩、解压缩和像素传输)的形式提供,它们作为核心基础(CF)类型出售。不需要直接访问硬件编码器和解码器的应用程序不需要直接使用VideoToolbox。详情可参考其开发文档videotoolbox开发文档。输入的是,输出的是。CVPixelBuffer再与OpenGL ES结合,将像素数据喂给OpenGL ES进行render。
2024-04-06 15:12:32
741
原创 IJKPLAYER源码分析-mediacodec硬解
mediacodec技术是Android系统音视频硬编/硬解的一套标准,各硬件厂商加以实现,常和MediaDrmImageSurfaceAudioTrack一起使用。请参考MEDIACODEC开发文档。由上图了解到,一言以蔽之,一端输入、一端输出,input输入的数据提交给codec异步处理后,由output输出再归还给codec。
2024-04-06 15:11:44
1282
原创 macOS上编译obs-studio
最近基于obs的1个二开程序,需要移植到macOS平台上,由于遇到些问题,本文记录下如何在macOS上配置&编译&运行obs程序完整过程。
2023-08-22 17:25:00
2211
原创 IJKPLAYER源码分析-主结构体
本文来介绍下IJKPLAYER的几个主要结构体。主要有以下几个:IjkMediaPlayer:是IJKPLAYER的外围结构体,最接近于caller层,主要包装了FFPlayer结构;FFPlayer:这个代表的是IJKPLAYER播放器内核的结构;VideoState:这个是FFPLAY的上下文,被IJKPLAYER包装在了FFPlayer中;
2023-05-03 11:03:16
711
原创 IJKPLAYER源码分析-重要字段
本文来介绍下IJKPLAYER的几个重要字段,对这些个字段的理解,将更有助于理解IJKPLAYER播放器内核。
2023-05-02 19:25:27
1310
1
原创 IJKPLAYER源码分析-点播原理
本文对IJKPLAYER的点播原理做下分析,主要涉及到拖动播放、精准SEEK、暂停和恢复播放等几个常用操作。下文分析均是在iOS端,Android端也类似,只是多了JNI层调用。
2023-04-23 21:10:20
1355
原创 IJKPLAYER源码分析-常用API
本文简要介绍IJKPLAYER的几个关键API,站在使用的角度,来审视其内部运作原理。这里以iOS端直播API调用切入。
2023-04-20 17:01:02
854
ffmpeg mp4 => hls + tls
2023-03-17
innosetup安装包制作工具
2023-03-15
VS2019 16的ASAN常用选项
2022-07-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人