obs-studio 源码学习 obs.h

obs.h 引用头文件介绍

c99defs.h:这个头文件提供了一些 C99 标准的定义和声明,包括一些常用的宏定义和类型定义,用于提高代码的可移植性和兼容性。

bmem.h:这个头文件提供了对内存分配和管理的功能,包括一些内存分配和释放的函数和宏定义,用于方便地进行内存操作。

profiler.h:这个头文件提供了性能分析和调试的功能,包括一些性能分析和调试的函数和宏定义,用于分析和优化程序的性能。

text-lookup.h:这个头文件提供了对文本查找和处理的功能,包括一些文本查找和处理的函数和宏定义,用于方便地处理文本数据。

graphics.h:这个头文件提供了对图形处理的功能,包括一些图形处理的函数和宏定义,用于处理图形数据和图形显示。

vec2.h 和 vec3.h:这两个头文件提供了对二维向量和三维向量的定义和操作,包括向量的创建、计算、转换等功能。

audio-io.h 和 video-io.h:这两个头文件提供了对音频和视频输入输出的功能,包括音频和视频的采集、处理、编码、解码等功能。

signal.h 和 proc.h:这两个头文件提供了对回调函数和信号处理的功能,包括对信号的发送、接收和处理等功能。

obs-config.h 和 obs-defs.h:这两个头文件提供了对 OBS Studio 配置和定义的功能,包括对配置文件的读取、写入和管理等功能。

obs-data.h 和 obs-properties.h:这两个头文件提供了对 OBS Studio 数据和属性的功能,包括对数据的读取、写入和管理,以及对属性的定义和操作等功能。

obs-interaction.h:这个头文件提供了对 OBS Studio 交互的功能,包括对交互的定义和操作,用于实现用户与程序的交互。

obs-missing-files.h:这个头文件可能包含了一些缺失的文件或者需要特别处理的文件。它通常用于处理一些特殊情况或者缺失的文件。

obs-source.h:这个头文件包含了对源(Source)的定义和声明,包括对源的创建、销毁、配置、显示等操作的声明。通过这个头文件,可以实现对视频和音频源的管理和控制。

obs-encoder.h:这个头文件包含了对编码器(Encoder)的定义和声明,包括对编码器的创建、销毁、配置、编码等操作的声明。通过这个头文件,可以实现对视频和音频的编码和处理。

obs-output.h:这个头文件包含了对输出(Output)的定义和声明,包括对输出的创建、销毁、配置、发送等操作的声明。通过这个头文件,可以实现对输出的管理和控制。

obs-service.h:这个头文件包含了对服务(Service)的定义和声明,包括对服务的创建、销毁、配置、连接等操作的声明。通过这个头文件,可以实现对服务的管理和控制。

obs-audio-controls.h:这个头文件包含了对音频控制的定义和声明,包括对音频的采集、处理、控制等操作的声明。通过这个头文件,可以实现对音频的管理和控制。

obs-hotkey.h:这个头文件包含了对热键(Hotkey)的定义和声明,包括对热键的创建、销毁、绑定等操作的声明。通过这个头文件,可以实现对热键的管理和控制。

结构体

c 复制代码
/** 用于改变项目的顺序(例如,源中的滤镜或场景中的项目)的枚举类型 */
enum obs_order_movement {
	OBS_ORDER_MOVE_UP,        /**< 将项目向上移动 */
	OBS_ORDER_MOVE_DOWN,      /**< 将项目向下移动 */
	OBS_ORDER_MOVE_TOP,       /**< 将项目移动到顶部 */
	OBS_ORDER_MOVE_BOTTOM,    /**< 将项目移动到底部 */
};

/**
 * 与 obs_source_process_filter 一起使用,用于指定滤镜应该直接使用指定效果渲染源,
 * 还是应该将其渲染到纹理上
 */
enum obs_allow_direct_render {
	OBS_NO_DIRECT_RENDERING,   /**< 不允许直接渲染 */
	OBS_ALLOW_DIRECT_RENDERING /**< 允许直接渲染 */
};

/** 用于指定缩放类型的枚举类型 */
enum obs_scale_type {
	OBS_SCALE_DISABLE,    /**< 禁用缩放 */
	OBS_SCALE_POINT,      /**< 最近邻插值 */
	OBS_SCALE_BICUBIC,    /**< 双三次插值 */
	OBS_SCALE_BILINEAR,   /**< 双线性插值 */
	OBS_SCALE_LANCZOS,    /**< Lanczos 插值 */
	OBS_SCALE_AREA        /**< 区域插值 */
};

/** 用于指定混合方法的枚举类型 */
enum obs_blending_method {
	OBS_BLEND_METHOD_DEFAULT,   /**< 默认混合方法 */
	OBS_BLEND_METHOD_SRGB_OFF   /**< 关闭 sRGB */
};

/** 用于指定混合类型的枚举类型 */
enum obs_blending_type {
	OBS_BLEND_NORMAL,     /**< 正常混合 */
	OBS_BLEND_ADDITIVE,   /**< 加法混合 */
	OBS_BLEND_SUBTRACT,   /**< 减法混合 */
	OBS_BLEND_SCREEN,     /**< 屏幕混合 */
	OBS_BLEND_MULTIPLY,   /**< 乘法混合 */
	OBS_BLEND_LIGHTEN,    /**< 变亮混合 */
	OBS_BLEND_DARKEN      /**< 变暗混合 */
};

/**
 * 用于指示场景项使用的边界类型的枚举类型。主要确定图像在这些边界内如何缩放,或者是否使用边界。
 */
enum obs_bounds_type {
	OBS_BOUNDS_NONE,            /**< 没有边界 */
	OBS_BOUNDS_STRETCH,         /**< 拉伸(忽略基本比例) */
	OBS_BOUNDS_SCALE_INNER,     /**< 缩放到内部矩形 */
	OBS_BOUNDS_SCALE_OUTER,     /**< 缩放到外部矩形 */
	OBS_BOUNDS_SCALE_TO_WIDTH,  /**< 缩放到宽度 */
	OBS_BOUNDS_SCALE_TO_HEIGHT, /**< 缩放到高度 */
	OBS_BOUNDS_MAX_ONLY,        /**< 无缩放,仅最大尺寸 */
};

/**
 * 视频转换信息结构体
 */
struct obs_transform_info {
	struct vec2 pos;       /**< 位置 */
	float rot;             /**< 旋转角度 */
	struct vec2 scale;     /**< 缩放比例 */
	uint32_t alignment;    /**< 对齐方式 */

	enum obs_bounds_type bounds_type;   /**< 边界类型 */
	uint32_t bounds_alignment;          /**< 边界对齐方式 */
	struct vec2 bounds;                 /**< 边界尺寸 */
};

/**
 * 视频初始化结构体
 */
struct obs_video_info {
#ifndef SWIG
	/**
	 * 要使用的图形模块(通常为 "libobs-opengl" 或 "libobs-d3d11")
	 */
	const char *graphics_module;
#endif

	uint32_t fps_num;                   /**< 输出帧率的分子 */
	uint32_t fps_den;                   /**< 输出帧率的分母 */

	uint32_t base_width;                /**< 基本合成宽度 */
	uint32_t base_height;               /**< 基本合成高度 */

	uint32_t output_width;              /**< 输出宽度 */
	uint32_t output_height;             /**< 输出高度 */
	enum video_format output_format;    /**< 输出格式 */

	/** 要使用的视频适配器索引(注意:避免在优化型笔记本电脑上使用) */
	uint32_t adapter;

	/** 使用着色器将颜色转换为不同的颜色格式 */
	bool gpu_conversion;

	enum video_colorspace colorspace;   /**< YUV 类型(如果是 YUV) */
	enum video_range_type range;        /**< YUV 范围(如果是 YUV) */

	enum obs_scale_type scale_type;     /**< 缩放类型 */
};

/**
 * 音频初始化结构体
 */
struct obs_audio_info {
	uint32_t samples_per_sec;   /**< 每秒采样数 */
	enum speaker_layout speakers;   /**< 扬声器布局 */
};

struct obs_audio_info2 {
	uint32_t samples_per_sec;   /**< 每秒采样数 */
	enum speaker_layout speakers;   /**< 扬声器布局 */

	uint32_t max_buffering_ms;   /**< 最大缓冲时间(毫秒) */
	bool fixed_buffering;   /**< 是否固定缓冲 */
};

/**
 * 通过 filter_audio 回调发送给源滤镜,允许对音频数据进行过滤
 */
struct obs_audio_data {
	uint8_t *data[MAX_AV_PLANES];   /**< 音频数据 */
	uint32_t frames;   /**< 帧数 */
	uint64_t timestamp;   /**< 时间戳 */
};

/**
 * 源音频输出结构体。用于 obs_source_output_audio 输出源音频。
 * 音频会根据需要进行自动重新采样和混音。
 */
struct obs_source_audio {
	const uint8_t *data[MAX_AV_PLANES];   /**< 音频数据 */
	uint32_t frames;   /**< 帧数 */

	enum speaker_layout speakers;   /**< 扬声器布局 */
	enum audio_format format;   /**< 音频格式 */
	uint32_t samples_per_sec;   /**< 每秒采样数 */

	uint64_t timestamp;   /**< 时间戳 */
};

struct obs_source_cea_708 {
	const uint8_t *data;   /**< 数据 */
	uint32_t packets;   /**< 数据包数量 */
	uint64_t timestamp;   /**< 时间戳 */
};

#define OBS_SOURCE_FRAME_LINEAR_ALPHA (1 << 0)   /**< 线性 Alpha 帧 */

/**
 * 用于指定源异步视频输出的结构体。与 obs_source_output_video 一起用于输出异步视频。
 * 视频根据时间戳进行必要的缓冲以按照时间戳播放。当与音频输出一起使用时,音频将与视频同步播放。
 *
 * 如果指定了 YUV 格式,它将自动在图形处理器上通过着色器进行上采样和转换为 RGB。
 *
 * 注意:对于非 YUV 格式,此结构体将始终被视为全范围!
 * 如果要对非 YUV 视频格式进行部分范围支持,请使用 obs_source_frame2 和 obs_source_output_video2。
 */
struct obs_source_frame {
	uint8_t *data[MAX_AV_PLANES];   /**< 视频数据 */
	uint32_t linesize[MAX_AV_PLANES];   /**< 每行的大小 */
	uint32_t width;   /**< 宽度 */
	uint32_t height;   /**< 高度 */
	uint64_t timestamp;   /**< 时间戳 */

	enum video_format format;   /**< 视频格式 */
	float color_matrix[16];   /**< 颜色矩阵 */
	bool full_range;   /**< 是否全范围 */
	uint16_t max_luminance;   /**< 最大亮度 */
	float color_range_min[3];   /**< 颜色范围的最小值 */
	float color_range_max[3];   /**< 颜色范围的最大值 */
	bool flip;   /**< 是否翻转 */
	uint8_t flags;   /**< 标志位 */
	uint8_t trc; /**< 视频 TRC(电荷重组时间)的枚举类型 */

	/* libobs 内部使用 */
	volatile long refs;   /**< 引用计数 */
	bool prev_frame;   /**< 上一帧 */
};

/**
 * 源帧结构体,用于 obs_source_output_video2 输出源视频。
 * 视频根据时间戳进行必要的缓冲以按照时间戳播放。
 *
 * 注意:对于非 YUV 格式,此结构体将始终被视为全范围!
 * 如果要对非 YUV 视频格式进行部分范围支持,请使用 obs_source_frame2 和 obs_source_output_video2。
 */
struct obs_source_frame2 {
	uint8_t *data[MAX_AV_PLANES];   /**< 视频数据 */
	uint32_t linesize[MAX_AV_PLANES];   /**< 每行的大小 */
	uint32_t width;   /**< 宽度 */
	uint32_t height;   /**< 高度 */
	uint64_t timestamp;   /**< 时间戳 */

	enum video_format format;   /**< 视频格式 */
	enum video_range_type range;   /**< 视频范围类型 */
	float color_matrix[16];   /**< 颜色矩阵 */
	float color_range_min[3];   /**< 颜色范围的最小值 */
	float color_range_max[3];   /**< 颜色范围的最大值 */
	bool flip;   /**< 是否翻转 */
	uint8_t flags;   /**< 标志位 */
	uint8_t trc; /**< 视频 TRC(电荷重组时间)的枚举类型 */
};

/** 获取用于启动 OBS 的 argc/argv。 */
struct obs_cmdline_args {
	int argc;   /**< 参数数量 */
	char **argv;   /**< 参数列表 */
};

未完待续

相关推荐
西岸行者10 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意10 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码10 天前
嵌入式学习路线
学习
毛小茛10 天前
计算机系统概论——校验码
学习
babe小鑫10 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms10 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下10 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。10 天前
2026.2.25监控学习
学习
im_AMBER10 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J10 天前
从“Hello World“ 开始 C++
c语言·c++·学习