From 6712a311f89ffff650cd0eefbeb80ec6332482f5 Mon Sep 17 00:00:00 2001 From: 16337 <1633794139@qq.com> Date: Wed, 21 Jan 2026 16:06:39 +0800 Subject: [PATCH] fix(camera): resolve camera status display issue --- api/camera.py | 40 ++++++++++++++++++++++++++++++++++++++++ inference/pipeline.py | 21 ++++++++++++--------- main.py | 3 ++- 3 files changed, 54 insertions(+), 10 deletions(-) diff --git a/api/camera.py b/api/camera.py index ae8f91e..d214381 100644 --- a/api/camera.py +++ b/api/camera.py @@ -15,6 +15,7 @@ from db.models import get_db from inference.pipeline import get_pipeline router = APIRouter(prefix="/api/cameras", tags=["摄像头管理"]) +router2 = APIRouter(prefix="/api/camera", tags=["摄像头状态"]) class CameraUpdateRequest(BaseModel): @@ -163,3 +164,42 @@ def get_camera_status(camera_id: int, db: Session = Depends(get_db)): "last_check_time": None, "stream": stream_info, } + + +router2 = APIRouter(prefix="/api/camera", tags=["摄像头状态"]) + + +@router2.get("/status/all") +def get_all_camera_status(db: Session = Depends(get_db)): + from db.crud import get_all_cameras, get_camera_status as get_status + + cameras = get_all_cameras(db, enabled_only=False) + pipeline = get_pipeline() + + result = [] + for cam in cameras: + status = get_status(db, cam.id) + + stream = pipeline.stream_manager.get_stream(str(cam.id)) + stream_info = stream.get_info() if stream else None + + if status: + result.append({ + "camera_id": cam.id, + "is_running": status.is_running, + "fps": status.fps, + "error_message": status.error_message, + "last_check_time": status.last_check_time.isoformat() if status.last_check_time else None, + "stream": stream_info, + }) + else: + result.append({ + "camera_id": cam.id, + "is_running": False, + "fps": 0.0, + "error_message": None, + "last_check_time": None, + "stream": stream_info, + }) + + return result diff --git a/inference/pipeline.py b/inference/pipeline.py index b671993..60e831a 100644 --- a/inference/pipeline.py +++ b/inference/pipeline.py @@ -323,20 +323,23 @@ class InferencePipeline: print("推理pipeline已停止") def get_status(self) -> Dict[str, Any]: - return { + result = { "running": self.running, "camera_count": len(self.camera_threads), - "cameras": { - cid: { - "running": self.camera_stop_events[cid] is not None and not self.camera_stop_events[cid].is_set(), - "fps": self.get_camera_fps(cid), - "frame_time": self.camera_frame_times.get(cid).isoformat() if self.camera_frame_times.get(cid) else None, - } - for cid in self.camera_threads - }, + "cameras": {}, "event_queue_size": len(self.event_queue), } + for cid in self.camera_threads: + frame_time = self.camera_frame_times.get(cid) + result["cameras"][str(cid)] = { + "is_running": self.camera_stop_events[cid] is not None and not self.camera_stop_events[cid].is_set(), + "fps": self.get_camera_fps(cid), + "last_check_time": frame_time.isoformat() if frame_time else None, + } + + return result + _pipeline: Optional[InferencePipeline] = None diff --git a/main.py b/main.py index f625a19..94324c2 100644 --- a/main.py +++ b/main.py @@ -32,7 +32,7 @@ def _patch_boxes_ndim(): _patch_boxes_ndim() from api.alarm import router as alarm_router -from api.camera import router as camera_router +from api.camera import router as camera_router, router2 as camera_status_router from api.roi import router as roi_router from api.sync import router as sync_router from config import get_config, load_config @@ -95,6 +95,7 @@ app.add_middleware( ) app.include_router(camera_router) +app.include_router(camera_status_router) app.include_router(roi_router) app.include_router(alarm_router) app.include_router(sync_router)