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崩溃的原因。
这是我使用助手函数设置场景的代码。不管有没有助手函数,它都会崩溃。然而,当我从定时器之外设置场景时,一切都很好。
任何形式的帮助都是感激的!
发布于 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>)调用中的变量,然后‘释放’该变量。就像这样:
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)https://stackoverflow.com/questions/73142444
复制相似问题