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