Windows Qt5 集成 OBS 實現錄製應用窗口(可指定窗口內錄製區域)

OBS 的編譯

編譯參考鏈接

Demo 工程

  1. 鏈接:https://pan.baidu.com/s/1vVPfsSZfzs2LBcfjEgUr3A 提取碼:3i4c;
  2. Qt 版本: 5.7.1 msvc2013;
  3. (1)工程下的 bin 目錄裏的內容需要拷貝到生成的 exe 同級目錄下;
    (2)obs-studio 爲頭文件及 obs.lib 的引用目錄;
  4. bin/obs-plugins/32bit 下的模塊庫,進行了裁剪,如果你編譯了 OBS 可自行比對並添加你需要的模塊;

重點說明

  1. Demo 裏有部分相應註釋,OBS 的封裝類 QtOBSContext,提供了錄製和推流的接口,
    demo 只演示了錄製功能,推流功能可參考自行實現;

  2. 錄屏及推流流程(參考 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;

  3. 參考 OBS 源碼的主要文件如下:
    (1). 錄屏流程 window-basic-main.cpp -> OBSBasic
    (2). 窗口捕獲 win-capture 模塊的 window-capture.c

  4. 修改的源碼
    (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;
  1. Aero 問題
    Win7 系統需要開啓 Aero(可以簡單的設置一個 Aero 主題,Win7 家庭普通版沒有 Aero,Win8、Win10 Aero 已經打開)
    否則會出現錄製過程中,其他應用遮擋錄製窗口的問題,把其他應用的窗口內容錄製進去。

  2. 聲道問題,可以使用 demo 中以下接口

void downmixMonoInput(bool enable);
void downmixMonoOutput(bool enable);
  1. Direct3D 初始化失敗
    dxdiag 查看你的顯卡信息,Direct 功能未啓動,未知等,可以安裝顯卡驅動解決

  2. 雙顯卡錄製黑屏的問題
    (1)可以在顯卡設置裏指定 demo 應用不使用加速;
    (2)也可以使用 demo 中的接口 updateVideoSettings,將 compatibility 設置爲 true。此方法相當於 obs 軟件中,【窗口捕獲】源設置界面裏的【多適配器的兼容性】;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章