OBS 的編譯
Demo 工程
- 鏈接:https://pan.baidu.com/s/1vVPfsSZfzs2LBcfjEgUr3A 提取碼:3i4c;
- Qt 版本: 5.7.1 msvc2013;
- (1)工程下的 bin 目錄裏的內容需要拷貝到生成的 exe 同級目錄下;
(2)obs-studio 爲頭文件及 obs.lib 的引用目錄; - bin/obs-plugins/32bit 下的模塊庫,進行了裁剪,如果你編譯了 OBS 可自行比對並添加你需要的模塊;
重點說明
-
Demo 裏有部分相應註釋,OBS 的封裝類 QtOBSContext,提供了錄製和推流的接口,
demo 只演示了錄製功能,推流功能可參考自行實現; -
錄屏及推流流程(參考 window-basic-main.cpp -> OBSBasic::OBSInit)大體如下:
(1)obs_initialized 及 obs_startup;
(2)加載各個模塊;
(3)配置音頻相關信息;
(4)配置視頻相關信息;
(5)創建 ffmpeg、rtmp 輸出,創建音視頻編碼器;
(6)創建音頻源;
(7)創建場景;
(8)創建窗口捕獲源,並添加到場景裏;
(9)其他流程
a. 開始錄製、停止錄製;
b. 開始推流、停止推流(demo 裏提供了此接口,但沒有做演示)
c. 音頻靜音(demo 裏提供了此接口,但沒有做演示);
d. 錄製窗口內指定區域;
(10)obs_shutdown; -
參考 OBS 源碼的主要文件如下:
(1). 錄屏流程 window-basic-main.cpp -> OBSBasic
(2). 窗口捕獲 win-capture 模塊的 window-capture.c -
修改的源碼
(1) obs-windows.c -> find_libobs_data_file
char *find_libobs_data_file(const char *file)
{
struct dstr path;
dstr_init(&path);
if (check_path(file, "data/libobs/", &path))
return path.array;
if (check_path(file, "../../data/libobs/", &path))
return path.array;
// 加入以下內容
// 加入搜索路徑的 debug 和 release 的前綴
// 以便於 QtCreator 運行程序時,可以正確加載相應文件
if (check_path(file, "debug/data/libobs/", &path))
return path.array;
if (check_path(file, "release/data/libobs/", &path))
return path.array;
// 加入結束
dstr_free(&path);
return NULL;
}
(2)window-capture.c -> wc_properties(此處可以不修改),這樣最小化的應用,也可以識別
fill_window_list(p, EXCLUDE_MINIMIZED, NULL);
改爲
fill_window_list(p, INCLUDE_MINIMIZED, NULL);
(3) windows-helpers.c -> get_window_exe
去除以下代碼,如果不去除,則不會識別當前的窗口進程
// if (id == GetCurrentProcessId())
// return false;
-
Aero 問題
Win7 系統需要開啓 Aero(可以簡單的設置一個 Aero 主題,Win7 家庭普通版沒有 Aero,Win8、Win10 Aero 已經打開)
否則會出現錄製過程中,其他應用遮擋錄製窗口的問題,把其他應用的窗口內容錄製進去。 -
聲道問題,可以使用 demo 中以下接口
void downmixMonoInput(bool enable);
void downmixMonoOutput(bool enable);
-
Direct3D 初始化失敗
dxdiag 查看你的顯卡信息,Direct 功能未啓動,未知等,可以安裝顯卡驅動解決 -
雙顯卡錄製黑屏的問題
(1)可以在顯卡設置裏指定 demo 應用不使用加速;
(2)也可以使用 demo 中的接口 updateVideoSettings,將 compatibility 設置爲 true。此方法相當於 obs 軟件中,【窗口捕獲】源設置界面裏的【多適配器的兼容性】;