Python Websockets обрабатывает только одноразовое использование

Я хочу сделать код на python, который браузеры могут подключить для получения видео потока.

Проблема в том, что мой код python обрабатывает только однократное использование, то есть если вы откроете браузер, он подключится к этому вебсокету правильно, но если вы обновите страницу, или другой клиент захочет получить доступ к потоку параллельно, этого не произойдет, говоря, что порт используется (эта ошибка на стороне сервера). Мой код:

import asyncio
import websockets
import cv2
import os
import signal

async def time1(websocket, path):

    while True:
        
            vid = cv2.VideoCapture('V_DRONE_097.mp4')
            vid.set(cv2.CAP_PROP_FPS,24)
        
        try:
            #v = VideoStreamWidget()
            #v.ops()
            
            while(vid.isOpened()):
                
                img, frame = vid.read()
                
                #frame = cv2.resize(frame, (640, 480))
                encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 65]
                man = cv2.imencode('.jpg', frame, encode_param)[1]
                #sender(man)
                #print(len(man.tobytes()))
                #cv2.imshow('img',man)
                await websocket.send(man.tobytes())
            
        except :
            pass

async def main():
    loop = asyncio.get_running_loop()
    stop = loop.create_future()
    #loop.add_signal_handler(signal.SIGTERM, stop.set_result, None)

    port = int(os.environ.get("PORT", "8585"))
    global stop1
    async with websockets.serve(time1, "", port):
        await stop
    stop1 = False
'''
async def main():
    async with websockets.serve(time1, "localhost", 8585):
        await asyncio.Future()  # run forever

asyncio.run(main())
'''
if __name__ == "__main__":
    while True:
        asyncio.run(main())

Я хочу, чтобы сервер продолжал работать, даже если клиент (браузер) обновляет страницу или закрывает ее и возвращается позже.

Вот код javascript, запущенный в браузере, если это поможет: openSocket = () => {

socket = new WebSocket("ws://127.0.0.1:8585/");
let msg = document.getElementById("msg");
socket.addEventListener('open', (e) => {
    document.getElementById("status").innerHTML = "Opened";
});
socket.addEventListener('message', (e) => {
    let ctx = msg.getContext("2d");
    let image = new Image();
    image.src = URL.createObjectURL(e.data);
    image.addEventListener("load", (e) => {
        ctx.drawImage(image, 0, 0, msg.width, msg.height);
    });
});

}

а это HTML код:

<!DOCTYPE html>
<html>
    <head>
        <title>Python_Websocket_Live_Streaming</title>
        <link rel="stylesheet" type="text/css" href="style.css">
        <script type="text/javascript" src="script.js" ></script>
    </head>
    <body onload="openSocket()">
        <div id="status">
            Connection failed. Somebody may be using the socket.
        </div>
        <div style="text-align: center">
            <canvas id="msg" width="960" height="720" style="display:inline-block" />
        </div>
        
    </body>
</html>

Я искал и пробовал много решений, но ничего не получилось. Моя конечная цель - интегрировать это с API django

Есть несколько виновников, но в конечном итоге я думаю, что while(vid.isOpened()) не позволяет асинхронному процессу быть свободным

edit

или застрял во внешнем цикле while

Вернуться на верх