同事提了个小需求,要求更改OBS的默认配置,并且每次修改完之后都不用保存用户的配置,就是定制化配置了,唯一默认配置。
开始探索OBS源码,看了一下需要修改的配置文件,主要是两个,一个basic.ini,一个推流配置的json文件。根据这两个文件以及log日志去分析源码。
(一) .obs_data分析
官网文档原话如下:
Settings (see libobs/obs-data.h) are used to get or set settings data typically associated with libobs objects, and can then be saved and loaded via Json text.
意思是配置是通过obs-data.h文件与libobs objects进行关联,以及保存了json配置文件,所以修改推流部分看的就是这里的代码。
obs_data结构体:
struct obs_data {
volatile long ref;
char *json;
struct obs_data_item *first_item;//链表
};
struct obs_data_item {
volatile long ref;
struct obs_data *parent;
struct obs_data_item *next;
enum obs_data_type type;
size_t name_len;
size_t data_len;
size_t data_size;
size_t default_len;
size_t default_size;
size_t autoselect_size;
size_t capacity;
};
上面两个结构体是obs_data中的两个基本结构体,可以通过调用obs_data_create()创建obs_data_t ,内部是分配堆上的空间,所以使用完之后要调用obs_data_release() 进行释放。
/* Set functions */
EXPORT void obs_data_set_string(obs_data_t *data, const char *name, const char *val);
EXPORT void obs_data_set_int(obs_data_t *data, const char *name, long long val);
EXPORT void obs_data_set_double(obs_data_t *data, const char *name, double val);
EXPORT void obs_data_set_bool(obs_data_t *data, const char *name, bool val);
EXPORT void obs_data_set_obj(obs_data_t *data, const char *name, obs_data_t *obj);
EXPORT void obs_data_set_array(obs_data_t *data, const char *name, obs_data_array_t *array);
通过上述API设置obs_data数据,内部实现主要如下,主要是链表的操作。
static void set_item_data(struct obs_data *data, struct obs_data_item **item,
const char *name, const void *ptr, size_t size,
enum obs_data_type type, bool default_data,
bool autoselect_data)
{
obs_data_item_t *new_item = NULL;
if ((!item || (item && !*item)) && data) {
new_item = obs_data_item_create(name, ptr, size, type,
default_data, autoselect_data);
obs_data_item_t *prev = obs_data_first(data);
obs_data_item_t *next = obs_data_first(data);
obs_data_item_next(&next);
for (; prev && next;
obs_data_item_next(&prev), obs_data_item_next(&next)) {
if (strcmp(get_item_name(next), name) > 0)
break;
}
new_item->parent = data;
if (prev && strcmp(get_item_name(prev), name) < 0) {
prev->next = new_item;
new_item->next = next;
} else {
data->first_item = new_item;
new_item->next = prev;
}
if (!prev)
data->first_item = new_item;
obs_data_item_release(&prev);
obs_data_item_release(&next);
} else if (default_data) {
obs_data_item_set_default_data(item, ptr, size, type);
} else if (autoselect_data) {
obs_data_item_set_autoselect_data(item, ptr, size, type);
} else {
obs_data_item_setdata(item, ptr, size, type);
}
}
官网文档地址:https://obsproject.com/docs/plugins.html#settings
同事要求修改的设置部分推流的默认配置,所以根据这部分代码,主要修改了推流对应的字段。