一、介绍

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

基于OBS的插件开发总结的更多相关文章

  1. 基于jquery的插件开发

    最近在公司做一个项目,由于后台数据太多需要分页显示,在网上找了很多插件都没有找到合适的分页插件,所有的分页插件始终达不到自己想要的效果.由于这个项目也不是很赶,就在网上查找各种资料,自己写一个基于jq ...

  2. (转)openfire插件开发(二) 基于web的插件开发

    转:http://blog.csdn.net/lovexieyuan520/article/details/38935137 在前面的博客中,我介绍了openfire插件开发,在那篇博客中我详细的说明 ...

  3. 基于IDEA Plugin插件开发,撸一个DDD脚手架

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 最近很感兴趣结合 IDEA Plugin 开发能力,扩展各项功能.也基于此使用不同的案例,探索 ...

  4. Android基于cordova3.3插件开发

    最近的工作项目,需要使用cordova插件开发,详细Cordova角色,不会走,你可以去百度自身OK该,直接启动.详细过程,我有一个小Demo解说提前进行. 还只是接触,东西太理论基础,我也不太清楚, ...

  5. 基于obs+nginx-rtmp-module搭建自己直播的系统

    前言 一句唠叨,工欲善其事,必先利其器,在程序员的工作里,搭建各种环境往往花费过多不必要的时间,这里建议搭建服务端环境时,尽量避开win.macos这种系统,个人比较推崇centos. 操作 下面以c ...

  6. OBS插件开发以及OBS插件的选择(obs直播插件)研究思路

    obs版本的选择: 工作室版,优化了很多东西,缺点是不能用插件,在部分机型不稳定,因为更新的很频繁.不过这个插件不能用的说法还是停留在早起,截至到今天已经完美支持,所以在不久的将来会越来越好,如果是开 ...

  7. 基于jq插件开发及弹窗实例

    基于jq的插件开发是什么鬼,$.fn是什么鬼,我在实际工作中也遇到过这个问题,下面就让我们一起来看一看这些都是什么鬼. 首先我们介绍$.fn. $.fn是指jquery的命名空间,加上fn上的方法及属 ...

  8. Eclipse 插件开发 -- 深入理解菜单(Menu)功能及其扩展点( FROM IBM)

    Eclipse 插件开发 -- 深入理解菜单(Menu)功能及其扩展点 菜单是各种软件及开发平台会提供的必备功能,Eclipse 也不例外,提供了丰富的菜单,包括主菜单(Main Menu),视图 / ...

  9. 3款知名RTMP推流模块比较:OBS VS SmartPublisher VS Flash Media Live Encoder

    OBS 功能强大,几乎所有你想要的场景它都有,用起来很顺手.可以将桌面.摄像头.程序窗口通过rtmp推送到流媒体服务器上. 当然如果你是开发者,想基于OBS做二次开发,实现二次产品化的化,难度比较大, ...

随机推荐

  1. dot

    今天写程序的时候发现一个问题啊 在主函数里面吧某个指针node* r=NULL 赋值为空 然后调用函数insert(node* r,....) 在insert里面呢,我给这个指针赋值了啊 但是主函数里 ...

  2. Pyserial操作串口

    pySerial 介绍 封装了串口通讯模块,支持Linux.Windows.BSD(可能支持所有支持POSIX的操作系统),支持Jython(Java)和IconPython(.NET and Mon ...

  3. linux下打包zip文件

    zip [参数] [打包后的文件名] [打包的目录路径] linux zip命令参数列表:-a 将文件转成ASCII模式-F 尝试修复损坏的压缩文件    -h 显示帮助界面-m       将文件压 ...

  4. Form表单中的get和post的区别

    method="get/post",两种方式的区别 Form中的get和post方法,在数据传输过程中分别对应了GET和POST方法.二者主要区别如下: 1.Get将表单中数据的按 ...

  5. 安卓初級教程(3):ContentProvider的運用原理

    package com.example.android.provider; import java.util.ArrayList; import java.util.HashMap; import j ...

  6. 图解集合6:LinkedHashMap

    初识LinkedHashMap 上两篇文章讲了HashMap和HashMap在多线程下引发的问题,说明了,HashMap是一种非常常见.非常有用的集合,并且在多线程情况下使用不当会有线程安全问题. 大 ...

  7. 那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)

    之前没接触过证书加密的话,对证书相关的这些概念真是感觉挺棘手的,因为一下子来了一大堆新名词,看起来像是另一个领域的东西,而不是我们所熟悉的编程领域的那些东西,起码我个人感觉如此,且很长时间都没怎么搞懂 ...

  8. 《HiWind企业快速开发框架实战》(2)使用HiWind创建自己的项目

    <HiWind企业快速开发框架实战>(2)使用HiWind创建自己的项目 关于HiWind HiWind企业快速开发框架,是基于.NET+EasyUi(支持各种前端扩展,后面将扩展Boot ...

  9. 大白话讲解Promise(三)搞懂jquery中的Promise

    前两篇我们讲了ES6中的Promise以及Promise/A+规范,在Promise的知识体系中,jquery当然是必不可少的一环,所以本篇就来讲讲jquery中的Promise,也就是我们所知道的D ...

  10. Linux 服务器监控

    200 ? "200px" : this.width)!important;} --> 标签:iostat/free/top/dstat 概述 文字主要讲述使用linux自带 ...