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, INCLUDE_MINIMIZED /*EXCLUDE_MINIMIZED*/, NULL);
(3) windows-helpers.c -> get_window_exe
去除以下代码,如果不去除,则不会识别当前的窗口进程
// if (id == GetCurrentProcessId())
// return false;
(4) obs-win-crash-handler.c。崩溃处理,如果不需要 obs 处理崩溃,请注释掉以下代码
void initialize_crash_handler(void)
{
static bool initialized = false;
if (!initialized) {
// SetUnhandledExceptionFilter(exception_handler);
initialized = true;
}
}
-
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 软件中,【窗口捕获】源设置界面里的【多适配器的兼容性】;
建议
如果你希望让录制程序在后台运行,通常会使用 QCoreApplication,这时你需要做一些单独得处理,比如 DPI Awareness 的处理等。
因此建议,尽量使用 QApplication app(argc, argv, false);