This commit is contained in:
2026-05-21 18:24:46 +08:00
parent e5c843334e
commit 4d347f1747
3 changed files with 245 additions and 247 deletions

View File

@@ -93,6 +93,7 @@ class WebRTCServer:
self.pcs = set()
self.fps = fps
self.frameContainer = [None]
self.frame_lock = threading.Lock()
self.hub = MonitoringHub()
self.sio = None
@@ -161,7 +162,7 @@ class WebRTCServer:
await pc.setRemoteDescription(
RTCSessionDescription(offer["sdp"], offer.get("type", "offer"))
)
pc.addTrack(VideoFrameTrack(self.fps, self.frameContainer))
pc.addTrack(VideoFrameTrack(self.fps, self.frameContainer, self.frame_lock))
dc = pc.createDataChannel("monitoring")
@@ -179,10 +180,12 @@ class WebRTCServer:
asyncio.run_coroutine_threadsafe(self._websocket_start(), self.background_loop)
def provide_frame(self, frame):
self.frameContainer[0] = frame
with self.frame_lock:
self.frameContainer[0] = frame.copy()
def send_data(self, data):
self.hub.send_data(data)
if self.background_loop.is_running():
self.background_loop.call_soon_threadsafe(self.hub.send_data, data)
def alert(self, timestamp, summary, level):
payload = {
@@ -207,10 +210,11 @@ class WebRTCServer:
class VideoFrameTrack(VideoStreamTrack):
def __init__(self, fps, fc):
def __init__(self, fps, fc, lock):
super().__init__()
self.fps = fps
self.frameContainer = fc
self.frame_lock = lock
async def next_timestamp(self):
"""
@@ -230,11 +234,13 @@ class VideoFrameTrack(VideoStreamTrack):
async def recv(self):
pts, time_base = await self.next_timestamp()
frame = self.frameContainer[0]
with self.frame_lock:
frame = self.frameContainer[0]
if frame is not None:
frame = frame.copy()
if frame is None:
frame = np.zeros((480, 640, 3), dtype=np.uint8)
else:
frame = self.frameContainer[0]
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
video_frame = av.VideoFrame.from_ndarray(frame, format="rgb24")
video_frame.pts = pts
@@ -255,4 +261,4 @@ def route_channel(channel):
print(f"Latency: {now - pre}ms")
case _:
print(f"Unknown Channel {channel.label}")
print(f"Unknown Channel {channel.label}")