obs-websocket插件使用小记


声明:本文转载自https://my.oschina.net/talenttan/blog/1579908,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

插播一条广告→2021 ByteDance字节跳动内推←各城市、各方向的岗位都有,大量招人!


最近在做一个直播平台,涉及到直播推流相关技术,因为不想给老板太多经济压力,暂时没有招聘流媒体相关技术人才,而是自己在倒腾,毕竟另外一个核心技术IM,笔者已经驾轻就熟,为项目节约了大量宝贵时间,所以花点时间来研究推流相关技术也算是对自己的一个技能包补充。闲话少说,进入正题。

推流面临的问题

  1. 推流服务器与业务服务器进行无缝配合
  2. 推流码的保护(防止推流码被别人盗取进而引起经济损失)
  3. 减少主播的学习成本(减少推流软件的设置步骤)

解决问题的方式

  1. 最简单的方式就是砸钱招人改造OBS
  2. 自己倒腾去研究一下OBS,看是不是有相关接口可以调用

带着这样问题和方向,笔者上周花了两天时间找了大量跟OBS相关的资料,最后一个叫obs-websocket的组件引起了笔者的注意,很自然的,从github上面把代码下下来,研究了一翻,这个研究不要紧,早期很多问题都迎刃而解了。

obs-websocket是什么?

obs-websocket是一个可以让你通过websocket来控制OBS的一个插件,其交互协议是见:https://github.com/Palakis/obs-websocket/blob/master/docs/generated/protocol.md,注意了,它只是一个OBS插件,所以你要在网页上控制OBS,你还需要有对应的网页客户端,这个自然要是一个websocket-client啦,目前已经在有一个叫obs-websocket-js的客户端实现,地址:https://github.com/haganbmj/obs-websocket-js

使用步骤

口子有了,还得学会如何使用,看了半天,发现文档真的不是特别多,只能自己来创造一个小文档啦。

  1. 下载并安装相关软件

    obs-websocket插件传送门:https://github.com/Palakis/obs-websocket/releases/download/4.2.0/obs-websocket-4.2.0-Windows-Installer.exe
    obs-websocket-js插件传送门:https://github.com/haganbmj/obs-websocket-js
  2. obs-websocket-js初步入门

    这个只要看官方的入门例子就可以了,本文的重点在后面的一些巧门
  3. obs-websocket-js使用巧门

    obs-websocket-js的官方小文档是很简陋的,不足以支撑直播项目的开发,所以笔者对其源代码进行了跟踪,当然代码是一方面,协议还是要大家自己去看的,否则也是没办法使用的。在源代码中有一个API.js,引起了笔者的注意,跟进去一看,原来是定义了一堆"常量",如下

    // This file is generated, do not edit. module.exports = {   "availableEvents": [     "SwitchScenes",     "ScenesChanged",     "SceneCollectionChanged",     "SceneCollectionListChanged",     "SwitchTransition",     "TransitionListChanged",     "TransitionDurationChanged",     "TransitionBegin",     "ProfileChanged",     "ProfileListChanged",     "StreamStarting",     "StreamStarted",     "StreamStopping",     "StreamStopped",     "StreamStatus",     "RecordingStarting",     "RecordingStarted",     "RecordingStopping",     "RecordingStopped",     "ReplayStarting",     "ReplayStarted",     "ReplayStopping",     "ReplayStopped",     "Exiting",     "Heartbeat",     "SourceOrderChanged",     "SceneItemAdded",     "SceneItemRemoved",     "SceneItemVisibilityChanged",     "PreviewSceneChanged",     "StudioModeSwitched"   ],   "availableMethods": [     "GetVersion",     "GetAuthRequired",     "Authenticate",     "SetHeartbeat",     "SetCurrentProfile",     "GetCurrentProfile",     "ListProfiles",     "StartStopRecording",     "StartRecording",     "StopRecording",     "SetRecordingFolder",     "GetRecordingFolder",     "StartStopReplayBuffer",     "StartReplayBuffer",     "StopReplayBuffer",     "SaveReplayBuffer",     "SetCurrentSceneCollection",     "GetCurrentSceneCollection",     "ListSceneCollections",     "GetSceneItemProperties",     "SetSceneItemProperties",     "ResetSceneItem",     "SetSceneItemRender",     "SetSceneItemPosition",     "SetSceneItemTransform",     "SetSceneItemCrop",     "SetCurrentScene",     "GetCurrentScene",     "GetSceneList",     "GetSourcesList",     "GetSourcesTypesList",     "GetVolume",     "SetVolume",     "GetMute",     "SetMute",     "ToggleMute",     "SetSyncOffset",     "GetSyncOffset",     "GetSourceSettings",     "SetSourceSettings",     "GetTextGDIPlusProperties",     "SetTextGDIPlusProperties",     "GetBrowserSourceProperties",     "SetBrowserSourceProperties",     "GetSpecialSources",     "GetStreamingStatus",     "StartStopStreaming",     "StartStreaming",     "StopStreaming",     "SetStreamSettings",     "GetStreamSettings",     "SaveStreamSettings",     "GetStudioModeStatus",     "GetPreviewScene",     "SetPreviewScene",     "TransitionToProgram",     "EnableStudioMode",     "DisableStudioMode",     "ToggleStudioMode",     "GetTransitionList",     "GetCurrentTransition",     "SetCurrentTransition",     "SetTransitionDuration",     "GetTransitionDuration"   ] }

    顺着这个,笔者搜索了其中一个常量,譬如“StartStreaming”,发现并没有在其它地方再出现该词,于是改搜“availableMethods”,这次搜到了,见下

    class OBSWebSocket extends Socket {   constructor() {     super();      this.availableRequests = [];     this.availableEvents = [];      this.registerRequest(API.availableMethods);     this.registerEvent(API.availableEvents);      this.registerEvent(['ConnectionOpened', 'ConnectionClosed', 'AuthenticationSuccess', 'AuthenticationFailure']);   }

    继续跟踪下去,来到了registerRequest()函数

      /**    * Add a new recognized request.    * Enables usage with the following syntaxes.    * `obs.requestName({args}, callback(err, data)) returns Promise`    * `obs.RequestName({args}, callback(err, data)) returns Promise`    *    * @param  {Array}  [requestNames=[]] String or Array of String request names as defined by the obs-websocket plugin.    */   registerRequest(requestNames = []) {     if (!Array.isArray(requestNames)) {       requestNames = [requestNames];     }      requestNames.forEach(requestName => {       this.availableRequests.push(requestName);       const handler = function (args, callback) {         return this.send(requestName, args, callback);       };        this[requestName] = handler;       this[requestName.charAt(0).toLowerCase() + requestName.slice(1)] = handler;     });   }

    代码翻到这,再配合回忆官方那个简陋的例子,对于如何和obs-socket插件通讯已经基本了解了:遍历API.js里面定义的常量列表,然后用常量作为方法名(首字母可以小写),至于参数有哪些,就要看前面我发的那个协议文档啦。阅读本文的同学,都是一些有丰富经验的工程师了,所以本文也是在于点到即止,不进行手把手的教会啦。好了,我还要继续开发我的直播平台!

    希望本文对你如何控制OBS有帮助!

     

本文发表于2017年11月26日 12:33
(c)注:本文转载自https://my.oschina.net/talenttan/blog/1579908,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2930 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1