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