You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OBS WebSocket切换场景失败排查请求(OBS 30.1.1)

OBS WebSocket场景切换失败排查方案

尝试通过WebSocket控制OBS(版本30.1.1)切换场景,OBS内存在“Scene”和“Scene2”两个场景,但执行代码后未完成切换。当前代码调用的是SetCurrentSceneCollection接口(用于切换场景集合),代码如下:

private async void Form1_Load(object sender, EventArgs e)
{
    Uri uri = new Uri("ws://192.168.1.68:4455");

    using (ClientWebSocket webSocket = new ClientWebSocket())
    {
        try
        {
            await webSocket.ConnectAsync(uri, CancellationToken.None);

            Console.WriteLine("已与OBS WebSocket服务器建立连接");

            //await SendMessage(webSocket, "{\"request-type\":\"GetVersion\",\"message-id\":\"1\"}");

            await SendMessage(webSocket, "{\"requestType\":\"SetCurrentSceneCollection\",\"requestData\": {\"sceneCollectionName\": \"Scene\"}}");
            //await SendMessage(webSocket, "{\"request-type\":\"GetCurrentScene\",\"message-id\":\"1\"}");
            string response = await ReceiveMessage(webSocket);


            //string response = await ReceiveMessage(webSocket);
            Console.WriteLine($"服务器响应:{response}");

        }
        catch (Exception ex)
        {
            Console.WriteLine($"连接OBS WebSocket服务器时出错:{ex.Message}");
        }
    }
}

static async Task SendMessage(ClientWebSocket webSocket, string message)
{
    byte[] buffer = Encoding.UTF8.GetBytes(message);
    await webSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None);
}

static async Task<string> ReceiveMessage(ClientWebSocket webSocket)
{
    byte[] buffer = new byte[1024];
    var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
    return Encoding.UTF8.GetString(buffer, 0, result.Count);
}

排查与修复步骤

  1. 核心错误:混淆场景与场景集合概念
    OBS的「场景」和「场景集合」是完全独立的概念:

    • 场景是单一直播/录制画布(你需要切换的目标)
    • 场景集合是一组场景的保存套餐
      代码中调用的SetCurrentSceneCollection是切换场景集合的接口,完全不符合需求。正确接口应为:
    • SetCurrentProgramScene:切换主输出场景(观众看到的画面)
    • SetCurrentPreviewScene:切换预览场景(仅Studio模式下生效)
      修正后的请求内容:
    {"requestType":"SetCurrentProgramScene","requestData": {"sceneName": "Scene"}, "messageId": "1"}
    
  2. 补充必填的messageId字段
    OBS WebSocket v5版本(OBS 28+默认搭配)要求所有请求必须携带messageId,否则服务器可能忽略请求。需在JSON请求中添加该字段,值可以是任意唯一字符串(如数字、UUID)。

  3. 检查权限鉴权
    如果OBS WebSocket设置了连接密码,代码缺少鉴权步骤会导致操作被拒绝。需在连接后先发送鉴权请求:

    {"requestType":"Authenticate","requestData": {"password": "你的WebSocket密码"}, "messageId": "auth001"}
    

    可先在OBS「工具」-「WebSocket服务器设置」中关闭密码,测试功能正常后再添加鉴权逻辑。

  4. 修复消息接收逻辑
    当前ReceiveMessage仅接收一次消息,但OBS可能返回多条消息(心跳、响应、事件),单次接收可能错过错误提示。建议循环接收并打印所有消息,直到获取目标messageId的响应:

    static async Task<string> ReceiveTargetMessage(ClientWebSocket webSocket, string targetMessageId)
    {
        byte[] buffer = new byte[4096];
        while (true)
        {
            var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
            string response = Encoding.UTF8.GetString(buffer, 0, result.Count);
            Console.WriteLine($"收到消息:{response}");
            // 解析JSON判断是否为目标messageId的响应
            var json = JsonDocument.Parse(response);
            if (json.RootElement.TryGetProperty("messageId", out var idElem) && idElem.GetString() == targetMessageId)
            {
                return response;
            }
        }
    }
    
  5. 校验场景名称准确性
    OBS对场景名称的大小写、空格完全敏感,确认代码中填写的sceneName与OBS内场景名称完全一致(比如Scene和scene会被视为不同场景)。


内容的提问来源于stack exchange,提问作者James

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 19:53:14