OBS架构
配置数据:json表示
libobs接口导出:export、import
多线程中的缓冲队列:circlebuf动态循环缓冲
分层
UI => libobs => 插件
libobs
C实现的,拥有一个全局变量控制所有事务。
- 视频采集渲染线程、视频编码线程:
频采集渲染线程负责生产视频帧,视频编码线程负责消耗视频帧,两个线程共同操作一个视频帧缓存队列,是一个标准的1对1生产者-消费者模型。
1. 根据设置的视频输出频率,每隔固定时间处理所有源的输入,并融合成一张图像缓存起来
2. 如果开启推流和录像,则通过信号通知视频编码线程编码视频帧
3. 渲染视频到UI窗口,使用户可以编辑推流画面
采集、渲染、编码都是调用相关的插件接口处理。libobs本身只作为一个框架存在,不处理具体的事务。 - 音频采集、音频编码
与视频采集编码一样是一个生产者和消费者的关系。 - 推流线程
插件系统
插件都是作为一个独立的动态库存在,对外抛出插件定义个接口,在libobs中合适的时候通过dlopen打开插件库,调用具体的接口。
插件的创建
主要是实现几个插件的接口:创建(创建回调)、销毁、update(属性更新)、video_render(视频渲染)等接口。
属性系统
UI属性:插件创建一个obs_property属性。应用层UI在对应的位置去遍历插件的属性接口,拿到属性后,根据对应的类型创建不同的UI。
编解码器属性:编解码器插件把对应的自己的数据注册到创建的属性中,UI层通过对应的编解码器获取到对于的属性。
相关技术
窗口采集
通过findwindow接口找到对应窗口的句柄,再通过BitBlt接口完成数据的拷贝。
桌面采集
可以使用窗口采集的BitBlt方式(桌面也是窗口的一种)。另外,效率较高的是采用DXGI接口采集。