ROI选区01
This commit is contained in:
160
api/camera.py
Normal file
160
api/camera.py
Normal file
@@ -0,0 +1,160 @@
|
||||
from typing import List, Optional
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from db.crud import (
|
||||
create_camera,
|
||||
delete_camera,
|
||||
get_all_cameras,
|
||||
get_camera_by_id,
|
||||
update_camera,
|
||||
)
|
||||
from db.models import get_db
|
||||
from inference.pipeline import get_pipeline
|
||||
|
||||
router = APIRouter(prefix="/api/cameras", tags=["摄像头管理"])
|
||||
|
||||
|
||||
@router.get("", response_model=List[dict])
|
||||
def list_cameras(
|
||||
enabled_only: bool = True,
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
cameras = get_all_cameras(db, enabled_only=enabled_only)
|
||||
return [
|
||||
{
|
||||
"id": cam.id,
|
||||
"name": cam.name,
|
||||
"rtsp_url": cam.rtsp_url,
|
||||
"enabled": cam.enabled,
|
||||
"fps_limit": cam.fps_limit,
|
||||
"process_every_n_frames": cam.process_every_n_frames,
|
||||
"created_at": cam.created_at.isoformat() if cam.created_at else None,
|
||||
}
|
||||
for cam in cameras
|
||||
]
|
||||
|
||||
|
||||
@router.get("/{camera_id}", response_model=dict)
|
||||
def get_camera(camera_id: int, db: Session = Depends(get_db)):
|
||||
camera = get_camera_by_id(db, camera_id)
|
||||
if not camera:
|
||||
raise HTTPException(status_code=404, detail="摄像头不存在")
|
||||
return {
|
||||
"id": camera.id,
|
||||
"name": camera.name,
|
||||
"rtsp_url": camera.rtsp_url,
|
||||
"enabled": camera.enabled,
|
||||
"fps_limit": camera.fps_limit,
|
||||
"process_every_n_frames": camera.process_every_n_frames,
|
||||
"created_at": camera.created_at.isoformat() if camera.created_at else None,
|
||||
}
|
||||
|
||||
|
||||
@router.post("", response_model=dict)
|
||||
def add_camera(
|
||||
name: str,
|
||||
rtsp_url: str,
|
||||
fps_limit: int = 30,
|
||||
process_every_n_frames: int = 3,
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
camera = create_camera(
|
||||
db,
|
||||
name=name,
|
||||
rtsp_url=rtsp_url,
|
||||
fps_limit=fps_limit,
|
||||
process_every_n_frames=process_every_n_frames,
|
||||
)
|
||||
|
||||
if camera.enabled:
|
||||
pipeline = get_pipeline()
|
||||
pipeline.add_camera(camera)
|
||||
|
||||
return {
|
||||
"id": camera.id,
|
||||
"name": camera.name,
|
||||
"rtsp_url": camera.rtsp_url,
|
||||
"enabled": camera.enabled,
|
||||
}
|
||||
|
||||
|
||||
@router.put("/{camera_id}", response_model=dict)
|
||||
def modify_camera(
|
||||
camera_id: int,
|
||||
name: Optional[str] = None,
|
||||
rtsp_url: Optional[str] = None,
|
||||
fps_limit: Optional[int] = None,
|
||||
process_every_n_frames: Optional[int] = None,
|
||||
enabled: Optional[bool] = None,
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
camera = update_camera(
|
||||
db,
|
||||
camera_id=camera_id,
|
||||
name=name,
|
||||
rtsp_url=rtsp_url,
|
||||
fps_limit=fps_limit,
|
||||
process_every_n_frames=process_every_n_frames,
|
||||
enabled=enabled,
|
||||
)
|
||||
if not camera:
|
||||
raise HTTPException(status_code=404, detail="摄像头不存在")
|
||||
|
||||
pipeline = get_pipeline()
|
||||
if enabled is True:
|
||||
pipeline.add_camera(camera)
|
||||
elif enabled is False:
|
||||
pipeline.remove_camera(camera_id)
|
||||
|
||||
return {
|
||||
"id": camera.id,
|
||||
"name": camera.name,
|
||||
"rtsp_url": camera.rtsp_url,
|
||||
"enabled": camera.enabled,
|
||||
}
|
||||
|
||||
|
||||
@router.delete("/{camera_id}")
|
||||
def remove_camera(camera_id: int, db: Session = Depends(get_db)):
|
||||
pipeline = get_pipeline()
|
||||
pipeline.remove_camera(camera_id)
|
||||
|
||||
if not delete_camera(db, camera_id):
|
||||
raise HTTPException(status_code=404, detail="摄像头不存在")
|
||||
|
||||
return {"message": "删除成功"}
|
||||
|
||||
|
||||
@router.get("/{camera_id}/status")
|
||||
def get_camera_status(camera_id: int, db: Session = Depends(get_db)):
|
||||
from db.crud import get_camera_status as get_status
|
||||
|
||||
status = get_status(db, camera_id)
|
||||
pipeline = get_pipeline()
|
||||
|
||||
stream = pipeline.stream_manager.get_stream(str(camera_id))
|
||||
if stream:
|
||||
stream_info = stream.get_info()
|
||||
else:
|
||||
stream_info = None
|
||||
|
||||
if status:
|
||||
return {
|
||||
"camera_id": camera_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:
|
||||
return {
|
||||
"camera_id": camera_id,
|
||||
"is_running": False,
|
||||
"fps": 0.0,
|
||||
"error_message": None,
|
||||
"last_check_time": None,
|
||||
"stream": stream_info,
|
||||
}
|
||||
Reference in New Issue
Block a user