一、介绍
OBS(Open Broadcaster Software)是一个广泛使用的视频录制直播软件。利用该软件可以实现桌面窗口、游戏、网页、RTMP流、图像等的录制直播。OBS也是一个开放源代码的软件,因此我们可以在源代码的基础上进行修改,来实现我们自己的定制功能。OBS Studio是当前正在维护的版本,老版本叫做OBS Classic。相对老版本而言,OBS Studio在架构上进行了重构,采用微内核+插件的形式进行开发。作者意图通过这种架构来独立出核心代码,将周边功能作为插件形式实现。这在一定程度上提高了项目的可维护性,也让新功能的扩展变得更加简单。OBS Studio本身内置了一些常用的插件,如窗口捕获、视频捕获设备、文本、图像、媒体源等。打开OBS Studio的插件安装目录,可以见到如下动态库文件:
也就是说,OBS中的插件是以动态链接库的形式实现的。在正式开发之前,我们需要配置好开发调试环境,后面的开发工作才能正常开展。
二、编译步骤
(1)下载OBS Studio的源代码。OBS Studio的工程托管在 Github上面。OBS Studio工程使用CMake进行管理,因此在特定平台进行编译时,还需安装CMake( https://cmake.org/)处理生成对应平台的工程。
(2)OBS Studio依赖FFmpeg框架,因此还需要下载预编译好的FFmpeg库。官方提供了一个下载地址( http://code.fosshub.com/OBS/downloads)。该页面提供了VS2013和VS2015两个版本的预编译库。根据自己的开发环境选择对应的库版本。下载好后解压到文件夹即可。
(3)设置好环境变量。这里设置的环境变量其实就是为了指定FFmpeg的库路径。需要指定的路径包括:
DepsPath:包含所有依赖库的路径,但不包括Qt库。
FFmpegPath:仅包含FFmpeg库的路径。
x264Path:仅包含x264库的路径。
curlPath:仅包含cURL库的路径。
如果需要编译真个OBS Studio UI的话,还需要设置另外一个环境变量:
QTDIR:指定Qt安装的根目录。如(C:\Qt\Qt5.5.1\5.5\msvc2013_64)
当然如果仅仅只需要编译插件目录下的插件,可以不用指定QTDIR变量。
(4)打开CMAKE,指定好源代码文件夹路径和输出文件夹路径。注意的是,OBS Studio工程默认情况下是编译UI的。如果不想编译UI,那么需要在CMake中新建一个BOOL变量:DISABLE_UI。指定不需要编译UI,否则CMake会尝试搜索QTDIR变量失败,导致CMake过程也失败。
(5)到此步时,可以点击Configure按钮,CMAKE会根据环境来生成工程文件了。在Windows平台下可以选择生成Visual Studio的工程。第一次Configure完成之后,勾选上面的COPY_DEPENDENCIES选项,然后再次点击Configure进行配置。这时可能会出现如下错误:
这是因为我们在下载OBS Studio工程时没有下载完整,因为工程中这部分代码给独立成一个单独的仓库了:
点击这个链接,即可跳到相应的代码仓库中。下载好的代码放到如下位置:
再次点击Configure,可以看到CMake顺利生成了VS工程。
(6)打开生成的VS工程BuildAll.sln,生成解决方案,发现出现了一大批的Error C2275。原来是VS对于C语言的严格要求导致的。VS要求C语言中所有的变量声明都放到函数的起始位置。那就手动一个个把它修改一下吧。网上也可以找到其他解决方案。修改完之后即可成功生成解决方案了。
(7)启动调试的时候可能会出现如下错误:
这是因为调试时的工作目录不一样,需要在VS中进行设置:
保存设置之后,即可成功启动调试了。
三、总结
OBS Studio工程的配置总体上来说步骤较多,但是好在不算太麻烦。遇到了很多问题,但是大多都能顺利解决。另外,OBS Studio已经成为了一个跨平台的开源软件,在尝试编译的过程中,也发现了官方其实提供了一个安装指南(https://github.com/jp9000/obs-studio/wiki/Install-Instructions)。该指南为Windows,Linux,Mac OS X平台都提供了具体的指导。因此用户在编译安装时,其实可以按照指南一步步跟着来。对于OBS Studio的代码,官方在开发的时候提供了代码注释,可以利用Doxygen工具来提取这些注释,从而生成帮助文档。开发初始阶段,建议还是调试OBS Studio内置的插件,来熟悉下OBS Studio的插件架构。
四、参考链接
1. http://blog.csdn.net/leixiaohua1020/article/details/14215391
2. http://www.cnblogs.com/dwdxdy/p/3713990.html
3. http://www.cnblogs.com/dwdxdy/p/3713968.html
4. http://www.tuicool.com/articles/iYjAFn
5. http://yul100887.blog.163.com/blog/static/200336135201211143525930/
6. http://blog.csdn.net/bweaglegao/article/details/8540860