当无法连接到OBS软件时,为什么退出此Python代码需要2分钟?

时间:2018-09-29 20:15:56

标签: python websocket python-asyncio

我是Python的新手,我对asyncio并不了解。我想运行此脚本,如果尝试连接到10.11.0.124的OBS软件未运行以退出代码。该代码可以执行此操作,但是退出之前需要2分钟。我无法弄清楚为什么当它无法连接到不在10.11.0.124上运行的OBS软件时为何不能立即退出。

#! /usr/bin/python3

import asyncio
import urllib.request
import sys 
import datetime

from obswsrc import OBSWS
from obswsrc.requests import StartStopStreamingRequest

def logger(logmessage):
    f = open("log.txt", "a")
    f.write(str(datetime.datetime.now()) + " " + logmessage + "\n")
    f.close

async def main():

   try:
        async with OBSWS('10.11.0.124', 4444, "password") as obsws:

            logger("Connection established.")

            while True:

                event = await obsws.event()

                logger(str(format(event.type_name)))

                if(format(event.type_name) == "StreamStarting"):
                    HitURLToLoadAsset = urllib.request.urlopen("http://10.11.0.159/api/v1/assets/control/asset&b0983c0918b94856900040d9a9e8bdbf").read()
                    logger(str(HitURLToLoadAsset))

                if(format(event.type_name) == "StreamStopped"):
                    HitURLToLoadAsset = urllib.request.urlopen("http://10.11.0.159/api/v1/assets/control/asset&3b2fb67002364b269d0c2674a628533c").read()
                    logger(str(HitURLToLoadAsset))

            logger("Connection terminated.")

    except OSError:
        logger("OBS IS NOT RUNNING")

    except:
        logger(str(sys.exc_info()[1]))


loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()

2 个答案:

答案 0 :(得分:2)

OBSWS函数有两分钟的超时,因为它在内部使用了websockets模块,并且默认超时为两分钟。

详细分类:

我不了解asyncio,所以我就在这里停下来;某处可能还会有60秒的延迟,但如果没有,则可能是计算机运行缓慢。

答案 1 :(得分:0)

感谢帮助用户4815162342和wizzwizz4!这是我的最终解决方案。

我最终接受了wizzwizz4的建议,该建议是断开连接字符串,以便可以在其上使用asyncio.wait_for。

如果有人在乎代码本身就是看OBS,并且在开始流式传输时,请更改Screenly OSE上的资产以显示RTMP流。流停止后,请切换回Screenly OSE上的其他资产。

#! /usr/bin/python3

import asyncio
import urllib.request
import sys
import datetime

from obswsrc import OBSWS
from obswsrc.requests import StartStopStreamingRequest

def logger(logmessage):
    f = open("log.txt", "a")
    f.write(str(datetime.datetime.now()) + " " + logmessage + "\n")
    f.close


async def main():

    try:
        obsws = OBSWS('10.11.0.124', 4444, "password")
        # if no response from OBS in 30 seconds EXIT
        await asyncio.wait_for(obsws.connect(), timeout=30)

        logger("Connection established.")

        while True:

            event = await obsws.event()

            logger(str(format(event.type_name)))

            if(format(event.type_name) == "StreamStarting"):
                HitURLToLoadAsset = urllib.request.urlopen("http://10.11.0.159/api/v1/assets/control/asset&b0983c0918b94856900040d9a9e8bdbf").read()
                logger(str(HitURLToLoadAsset))

            if(format(event.type_name) == "StreamStopped"):
                HitURLToLoadAsset = urllib.request.urlopen("http://10.11.0.159/api/v1/assets/control/asset&3b2fb67002364b269d0c2674a628533c").read()
                logger(str(HitURLToLoadAsset))

    except asyncio.TimeoutError:
        logger("OBS NOT RUNNING-- TIMEOUT!")

    except OSError:
        logger("OBS IS NOT RUNNING")

    except:
        logger(str(sys.exc_info()[1]))

    finally:
        await obsws.close()
        logger("Connection terminated.")



loop = asyncio.get_event_loop()  
loop.run_until_complete(main())
loop.close()