fix(ui): sync_events 查询补 JOIN sync_videos 取 camera_name(修 1054 报错);feat(缩略图): Oracle 处理成功后抽首帧存 thumbs/{id}.jpg + /api/oracle/video/{id}/thumb 带 token 接口;fam-ui 视频会话显示缩略图(oracle_url+token);start_ui.sh 注入 .env

This commit is contained in:
ericwyuan
2026-08-21 13:37:23 +08:00
parent b7b5fe6f0b
commit 41485072bf
5 changed files with 74 additions and 4 deletions

View File

@@ -140,6 +140,10 @@ class VideoProcessor:
})
self.db.mark_video_processed(video_id, summary, norm_events, people, provider)
# 抽首帧生成缩略图(供前端展示;失败不影响主流程)
row = self.db.get_video_by_id(video_id)
if row and row['local_path']:
self._generate_thumb(video_id, row['local_path'])
# 更新 people 表(标签级,待 person_service 合并)
for p in people:
@@ -147,3 +151,31 @@ class VideoProcessor:
self.db.upsert_person(p, source='llm')
logger.info(f"[video_id={video_id}] 已落库: summary={len(summary)}字, "
f"events={len(norm_events)}, people={people}")
def _generate_thumb(self, video_id: int, video_path: str) -> bool:
"""抽视频首帧生成 JPEG 缩略图(/opt/fam-edge/thumbs/{video_id}.jpg"""
try:
import cv2
db_path = self.config.get('oracle_db', {}).get(
'path', '/opt/fam-edge/data/oracle.db')
thumbs_dir = os.path.abspath(os.path.join(
os.path.dirname(db_path), '..', 'thumbs'))
os.makedirs(thumbs_dir, exist_ok=True)
out = os.path.join(thumbs_dir, f"{video_id}.jpg")
cap = cv2.VideoCapture(video_path)
try:
ok, frame = cap.read()
finally:
cap.release()
if not ok or frame is None:
logger.warning(f"抽帧失败 video_id={video_id}: 无法读取首帧")
return False
h, w = frame.shape[:2]
if w > 640:
frame = cv2.resize(frame, (640, int(h * 640 / w)))
cv2.imwrite(out, frame, [cv2.IMWRITE_JPEG_QUALITY, 65])
logger.info(f"缩略图已生成: {out}")
return True
except Exception as e:
logger.warning(f"抽帧异常 video_id={video_id}: {e}")
return False