使用obs-websocket-py设置OBS源可见性失败,求解决方案
问题分析与解决方案
你的核心问题是用错了API接口:SetInputSettings是用来修改输入源的配置参数(比如图片路径、音频设置),不是控制场景中源的可见性。要控制源在场景里的显示/隐藏,应该使用SetSceneItemEnabled接口——因为源的可见性是它在特定场景中的实例属性,而非输入源本身的属性。
另外你的代码还有两处细节问题:
input_settings里的拼写错误:visibile应为visible(但这个参数本就不属于SetInputSettings,所以改了也没用)- 函数参数
source和visibility未实际使用,硬编码了源名称,灵活性不足
修正后的可用代码示例
from obswebsocket import obsws, requests from obswebsocket.exceptions import ConnectionFailure, ServerError # 配置信息,替换成你的OBS地址、端口、密码 IP = "localhost" PORT = 4455 PASSWORD = "your_password_here" SOCK = None INITIALISED = False def create_connection(): global INITIALISED, SOCK try: SOCK = obsws(IP, PORT, PASSWORD) SOCK.connect() INITIALISED = True print("连接OBS成功") except ConnectionFailure as e: print(f"连接失败: {e}") raise def set_source_visibility(scene_name, source_name, is_visible): global SOCK if not INITIALISED: create_connection() try: # 使用SetSceneItemEnabled接口控制场景中源的可见性 response = SOCK.call(requests.SetSceneItemEnabled( sceneName=scene_name, sceneItemName=source_name, sceneItemEnabled=is_visible )) # 检查响应是否成功 if response.status: print(f"已{'显示' if is_visible else '隐藏'}场景[{scene_name}]中的源[{source_name}]") else: print(f"操作失败: {response.error}") except ServerError as e: print(f"OBS返回错误: {e}") except Exception as e: print(f"未知错误: {e}") # 调用示例:隐藏"主场景"中的"Art 8 - Image"源 set_source_visibility("主场景", "Art 8 - Image", False) # 调用示例:显示该源 # set_source_visibility("主场景", "Art 8 - Image", True)
关键说明
- 接口选择:
SetSceneItemEnabled是专门用于控制场景内源可见性的接口,需要传入三个必填参数:sceneName:目标场景的名称(比如OBS里的"主场景")sceneItemName:要控制的源名称sceneItemEnabled:布尔值,True为显示,False为隐藏
- 错误捕获:添加了异常捕获逻辑,能帮你定位连接或操作失败的原因(之前无提示是因为没处理异常)
- 参数复用:修正了原代码中参数未使用的问题,让函数更通用
内容的提问来源于stack exchange,提问作者Istalri Skolir
相关产品推荐
相关产品推荐

