您的位置:首页 > 其它

obs-studio源码阅读笔记:学习obs流程的第一步,test程序

2017-04-21 11:57 1566 查看
今天终于跑通了obs-studio的test项目,该程序流程非常简单,对类似我这样的初学者来说,摈除一些干扰项来学习obs-studio加载模块的基本流程,还是很有用的!



图一 程序运行成功后的效果截图

在调试的过程中主要遇到的问题是:

1、找不到"obs.dll"等一堆的dll文件;

2、抛出"Couldn't initialize video"的异常;

3、obs_source_create()调用失败;

第一个问题最简单,将所需要的dll文件(就是obs32.exe下的所有dll文件)拷贝过来;

后面两个问题有相同之处也有不同之处

相同之处都是相关的文件没有找到:第二个是data中的effect文件没有找到,第三个是项目所需的dll文件(test-input.dll)没有找到;

不同之处就是第三个问题还有其他的玄机在里面。

我们逐个问题来解决后面两个问题:
一、抛出"Couldn't initialize video"的异常;
通过debug发现,在函数CreateOBS()->obs_reset_video()->obs_init_graphics()中使用很多effect文件,通过查看find_libobs_data_file()函数的代码,我们可以知道这些effect
文件在以下两个目录中来寻找:
a、data/libobs/
b、../../data/libobs/
这两个目录在运行obs32.exe的时候工作是正常的,但我们使用F5进行debug跟踪test程序的时候,工作目录是win-test.sln所在的目录,所以按照这两个路径去找effect就会失败。因此,针对这个问题有两个解决办法:
a、将win-test.exe文件拷贝到obs32.exe目录下去运行。这个方法能解决当前的问题,但还会遇到下图的问题,遇到这个问题的原因是函数obs_load_all_modules()将“build\rundir\Debug\obs-plugins\32bit”目录下的所有dll文件加载进去了,导致了一些异常。实际上该test项目只需要加载test-input.dll文件即可,具体的解决办法后面再描述。



图二 加载dll时出现的异常弹出框
b、第二办法,也就是我最后采用的办法,就是将“build\rundir\Debug\data”文件夹拷贝到“build\test\win”目录下,也就是win-test.sln所在的目录。

二、后面的obs_source_create()调用失败:
通过打印的调试信息可以看到在create source失败了,除此之外没有看到其他明显的异常信息;
在obs_source_create()之前,CreateOBS()之后就只有obs_load_all_modules()函数了,通过对该函数进行单步调试,才发现在load dll的时候失败了,通过添加obs_log_loaded_modules()也可以发现,没有任何模块加载成功。正如前面所说,模块加载失败的原因也是文件没有找到,只不过由effect文件换成dll文件了,按照跟踪所得到的信息,将“build\rundir\Debug\obs-plugins”文件夹整个拷贝到“build\test\win”下面。
这个时候,发现可以找到dll文件了,但是调试窗口则打印出dll加载失败的信息,问题由之前啥都不打印变成了打印失败了。通过新建dll文件来看,新生成的文件的确是在我们想要的目录中呀?这是什么鬼??为啥能找到dll文件了,还是无法加载成功呢?在网上找了很久还是一无所获。
没辙之下之后瞎碰,结果将obs-plugins文件夹拷贝到win-test.exe所在的“build\test\win\Debug”目录下就可以了,晕死!!
我恶意地猜测是:使用F5调试示以*.ln,即解决方案所在目录为当前目录;而已经运行期间加载dll文件有事以*.exe所在的目录为当前目录。再加上各种make文件指定,自己可能指定的工作目录,其复杂关系堪比感情关系。
因此就需要将“build\rundir\Debug\obs-plugins”文件夹同时拷贝在“build\test\win”和“build\test\win\Debug”两个目录下,原因见上面。
到此为止,就可以看到部分模块加载成功的打印信息,为什么是“部分”呢?原因是这个时候,程序会弹出图二所示的错误。想了想,在这个test程序中,我们根本没有使用qt相关的东西呀?为什么会出现这个异常?再想想,这个test流程非常简单,是不是加载了一些额外的模块导致的呢?等只留下test-input相关的两个文件之后,perfect!obs_load_all_modules()成功通过!语句“SourceContext source = obs_source_create("random",
"some randon source", NULL, nullptr);”通过,创建source成功。接下来的创建filter的时候,还是失败了。
这个时候,已经有经验了,这些困难已经无法阻挡我们奔向成功的脚步,通过单步调试发现,在调用filter_create()函数的时候查找“test.effect”文件失败,通过创建测试文件发现,该文件的查找路径是“data\test-input\test.effect”,而该文件实际的位置是“data\obs-plugins\test-input\test.effect”。解决办法很简单,就是将“build\test\win\data\obs-plugins\test-input”文件夹拷贝到“build\test\win\data\”下。

到这里,整个测试程序就能正常运行起来,看到图一的效果了。

总结一下要修改的地方:

1、将“build\rundir\Debug\data”文件夹拷贝到“build\test\win”目录下,也就是win-test.sln所在的目录;

2、将“build\rundir\Debug\obs-plugins”文件夹同时拷贝在“build\test\win”和“build\test\win\Debug”两个目录下;

3、将“build\test\win\obs-plugins”和“build\test\win\Debug\obs-plugins”两个文件夹下的dll文件都删除掉,只留下“test-input.pdb”和“test-input.dll”文件;

4、将“build\test\win\data\obs-plugins\test-input”文件夹拷贝到“build\test\win\data\”下。

该测试程序还有一个音频测试项,就是“test_sinewave”模块,研究音频的同学可以继续调试一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: