首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当set_current_scene函数在计时器回调(Python )中调用时会崩溃

当set_current_scene函数在计时器回调(Python )中调用时会崩溃
EN

Stack Overflow用户
提问于 2022-07-27 17:43:14
回答 1查看 73关注 0票数 0
代码语言:javascript
复制
scenes = obs.obs_frontend_get_scenes()
def script_load(settings):
    obs.obs_frontend_add_event_callback(onevent)

def script_update(settings):
    global trigger, s_minutes, s_seconds, ending, e_minutes, e_seconds
    trigger = obs.obs_data_get_string(settings, "e_trigger scene")
    s_minutes = obs.obs_data_get_int(settings, "s_minutes")
    s_seconds = obs.obs_data_get_int(settings, "s_seconds")
    e_minutes = obs.obs_data_get_int(settings, "e_minutes")
    e_seconds = obs.obs_data_get_int(settings, "e_seconds")
    ending = obs.obs_data_get_string(settings, "s_ending scene")

def timer_callback():
    global tElapsed
    if state == 0:
        print("Error: State = 0")
        obs.remove_current_callback()
    if state == 1:
        tElapsed += 1
        print(tElapsed)
        if tElapsed == timer:
            tElapsed = 0
            set_scene()
            obs.remove_current_callback()
    if state == 2:
        tElapsed += 1
        print(tElapsed)
        if tElapsed == timer:
            tElapsed = 0
            obs.obs_frontend_streaming_stop()
            obs.remove_current_callback()

def set_scene():
    index = (obs.obs_frontend_get_scene_names()).index(ending)
    scene = scenes[index]
    obs.obs_frontend_set_current_scene(scene)

def onevent(event):
    global state, timer
    if event==obs.OBS_FRONTEND_EVENT_STREAMING_STOPPED:
        state = 0
    if event==obs.OBS_FRONTEND_EVENT_STREAMING_STARTED:
        state = 1
        timer = s_minutes * 60 + s_seconds
        obs.timer_add(timer_callback,1000)
    if event==obs.OBS_FRONTEND_EVENT_SCENE_CHANGED:
        if obs.obs_source_get_name(obs.obs_frontend_get_current_scene()) == trigger:
           state = 2
           timer = e_minutes * 60 + e_seconds
           obs.timer_add(timer_callback,1000)
        else:
            obs.timer_remove(timer_callback)
            if state == 1:
                print("Start timer stopped")
            elif state == 2:
                print("End timer stopped")

当我试图在计时器回调函数中设置场景时,OBS最终崩溃了。每次调用回调函数时,我都试图打印这个号码,当我查看日志时,它显示了它应该调用的每个打印函数,但它并没有告诉我OBS崩溃的原因。

这是我使用助手函数设置场景的代码。不管有没有助手函数,它都会崩溃。然而,当我从定时器之外设置场景时,一切都很好。

任何形式的帮助都是感激的!

EN

回答 1

Stack Overflow用户

发布于 2022-11-11 21:51:21

这可能有点晚了,我对OBS的编程还比较陌生,但我注意到您的代码使用了"obs_frontend_get_current_scene()“。有一些调用,包括这个调用,每当调用指针时都会创建指针。必须释放这些指针,否则它们将继续消耗越来越多的资源。

根据API文档(https://obsproject.com/docs/reference-frontend-api.html?highlight=obs_frontend_get_current_scene),在调用它时会创建一个新的引用。虽然这个文档条目并不明显,但是引用可以用"obs.obs_source_release(<sourcename>)“发布,因为obs_frontend_get_current_scene()返回一个源。

我不知道是否像您所做的那样在内联使用时创建引用(不将其赋值给变量),但这可能是问题所在。尝试将obs_frontend_get_current_scene()分配给一个变量,使用obs_source_get_name(<source name>)调用中的变量,然后‘释放’该变量。就像这样:

代码语言:javascript
复制
scene_as_source = obs.obs_frontend_get_current_scene()
if obs.obs_source_get_name(scene_as_source) == trigger:
   state = 2
   timer = e_minutes * 60 + e_seconds
   obs.timer_add(timer_callback,1000)
else:
    obs.timer_remove(timer_callback)
    if state == 1:
        print("Start timer stopped")
    elif state == 2:
        print("End timer stopped")
obs.obs_source_release(scene_as_source)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73142444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档