Windows Qt5 集成 OBS 实现录制应用窗口(可指定窗口内录制区域)

2 篇文章 0 订阅
1 篇文章 0 订阅

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, 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;
	}
}
  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 软件中,【窗口捕获】源设置界面里的【多适配器的兼容性】;

建议

如果你希望让录制程序在后台运行,通常会使用 QCoreApplication,这时你需要做一些单独得处理,比如 DPI Awareness 的处理等。
因此建议,尽量使用 QApplication app(argc, argv, false);

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值