同僚提了個小需求,要求更改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
同僚要求修改的設定部分推流的預設配置,是以根據這部分代碼,主要修改了推流對應的字段。