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有帮助!