您当前的位置: 首页 >  令狐掌门

obs源码分析【一】:main函数

令狐掌门 发布时间:2021-06-10 22:07:02 ,浏览量:2

目录
  • main函数在哪里
  • obs项目架构
  • main函数浅析
    • crash的处理
    • obs配置
    • obs log
    • 网络请求libcurl
    • 主界面
    • Qt适配高dpi屏幕
  • 总结

  最近对obs的代码感兴趣了,在obs里也抠了不少功能出来用到项目上,准备把自己的心得记录下来,有兴趣的可以一起留言讨论。   在学习obs源码之前,需要先编译obs的源码,有需要的可以看上一篇,obs项目的编译方法,需要的可以点击【obs编译方法】

main函数在哪里

  obs的界面是Qt写的,目测没用到QML, 既然是Qt, 那先从main函数开始,如果你是一个新手,在几百个cpp文件中,怎么快速找到main函数呢,ctrl F全局搜索

main(

  经过查找,可以很快确定是在obs-app里面, 如下图 在这里插入图片描述

  找到main函数,万里长城第一步开始了,剩下的就是坚持看,调试。

obs项目架构

  来看看obs项目的构成 在这里插入图片描述   我现在编译的版本是50个项目,大概分为5大块 (1)core 是一些核心渲染功能,dx, opengl等 (2)deps :obs的一些依赖 (3)frontend: 前端,也就是Qt界面 (4)plugins插件:比如录制,推流,x264编码等 (5)scripting: python lua脚本,这个可以不用关心   OBS是客户端项目,那么先从界面开始,主界面是OBSBasic.ui, 在frontend-obs模块可以找到 在这里插入图片描述

  打开看看: 在这里插入图片描述   原始界面比较朴素,经过qss渲染后就很漂亮的,颜值提高时隔档次。   界面找到了,回到main函数,看看main函数做什么。

main函数浅析 crash的处理

  首先是crash的处理,win32客户端开发的常规手段

#ifdef _WIN32
	obs_init_win32_crash_handler();
	SetErrorMode(SEM_FAILCRITICALERRORS);
	load_debug_privilege();
	base_set_crash_handler(main_crash_handler, nullptr);
#endif

其实本质还是调用了SetUnhandledExceptionFilter,如下:

void initialize_crash_handler(void)
{
	static bool initialized = false;

	if (!initialized) {
		SetUnhandledExceptionFilter(exception_handler);
		initialized = true;
	}
}

这个异常处理有什么用呢,它主要是在程序崩溃时生成dump文件,给程序员提供分析的依据,关于dump文件的生成与调试,可以看我的这篇博客:【C++程序生成dump文件并分析dump】

obs配置

下面的代码

upgrade_settings();

这是做什么,打开basic.ini看看,怎么找到basic.ini, everything搜一搜就出来了,如下:

[General]
Name=未命名

[Video]
BaseCX=1920
BaseCY=1080
OutputCX=1920
OutputCY=1080
FPSType=0
FPSCommon=60

[Panels]
CookieId=5683CD9D974512F7

[SimpleOutput]
RecEncoder=x264
RecQuality=Small
FilePath=D:/
RecFormat=mp4
StreamEncoder=x264
Preset=veryfast

[Output]
Mode=Simple

[AdvOut]
TrackIndex=1
RecType=Standard
RecTracks=1
FLVTrack=1
FFOutputToFile=true
FFFormat=
FFFormatMimeType=
FFVEncoderId=0
FFVEncoder=
FFAEncoderId=0
FFAEncoder=
FFAudioMixes=1
VodTrackIndex=2

看这些参数可以猜测,应该是启动时的一些参数功能加载,具体代码得具体分析。把软件的一些配置做保存,下次打开时可以直接使用,这是常规操作,但是它的路径比较隐蔽,普通用户找不到C:\Users\One\AppData\Roaming\obs-studio\basic\profiles\未命名\basic.ini

obs log

下面是log的使用了,作为客户端开发,不会写用log是很尴尬的,看看obs的log怎么写,直接上代码:

base_get_log_handler(&def_log_handler, nullptr);
fstream logFile;
int ret = run_program(logFile, argc, argv);

blog(LOG_INFO, "Number of memory leaks: %ld", bnum_allocs());
base_set_log_handler(nullptr, nullptr);

跟踪代码可以看到obs的log和其它日志框架也是差不多的,大概分6个等级trace,debug,info,error,warning,fatal. 套路一样,API不同而已,但是写一个好的log也不是那么容易的,需要考虑到在多线程时如何打印,以及cpu消耗等,一个小小的log功能,并不那么简单,如果喜欢obs的log, 抠下来,用到你的项目中去,当然还有其它C++日志库,例如glog, log4cplus等。

static void def_log_handler(int log_level, const char *format, va_list args,
			    void *param)
{
	char out[4096];
	vsnprintf(out, sizeof(out), format, args);

	if (log_level = QT_VERSION_CHECK(5, 11, 0))
	QGuiApplication::setAttribute(opt_disable_high_dpi_scaling
					      ? Qt::AA_DisableHighDpiScaling
					      : Qt::AA_EnableHighDpiScaling);
#endif
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) && defined(_WIN32)
	QGuiApplication::setHighDpiScaleFactorRoundingPolicy(
		Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
#endif

具体什么功能,自己去查Qt助手。

总结

  main函数先分析这么多了,来总结一下本篇内容,根据以上的分析可以看到,写一个客户端项目,首先需要做哪些工作呢? (1)crash的处理,dump文件生成 (2)log功能 (3)网络功能 (4)高dpi适配 (5)界面处理 (6)多语言   以上功能在obs main函数中都做了,在项目开发中,如果有必要,可以借鉴obs的代码,所以说看看好的项目还是很有必要的。

  阅读obs源码分析全部文章,请点击【obs源码分析专栏】

关注
打赏
1688896170
查看更多评论

令狐掌门

暂无认证

  • 2浏览

    0关注

    485博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0540s