diff --git a/src/api/routes/algorithm_router.py b/src/api/routes/algorithm_router.py index e9507d1..e91676a 100644 --- a/src/api/routes/algorithm_router.py +++ b/src/api/routes/algorithm_router.py @@ -432,16 +432,20 @@ def process_video_check_task(task_id: int) -> bool: ) return False - # 构建视频路径列表 - video_paths = [] + # 构建视频信息列表 + video_infos = [] for video in video_list: video_path = os.path.join(settings.VIDEO_RESOURCE_DIR, video.video_name_on_server) if os.path.exists(video_path): - video_paths.append(video_path) + video_infos.append({ + 'video_id': video.id, + 'video_name': video.video_name, + 'video_path': video_path + }) else: logger.warning(f"视频文件不存在,跳过: {video_path}") - if not video_paths: + if not video_infos: logger.error(f"所有待检查视频文件都不存在: {task_id}") repository.update_task_status( task_id, 5, finish_time=datetime.now(), @@ -451,7 +455,7 @@ def process_video_check_task(task_id: int) -> bool: # 批量处理视频进行黑名单检测 results = video_biz.batch_process_videos_with_blacklist_detection( - video_paths, frame_skip, "_checked" + video_infos, frame_skip, "_checked" ) # 分析结果 @@ -468,7 +472,7 @@ def process_video_check_task(task_id: int) -> bool: "total_detections": total_detections, "video_results": results, "target_video": target_video_path, - "checked_videos": len(video_paths) + "checked_videos": len(video_infos) }, feature_data=feature_bytes ) diff --git a/src/video_check_biz.py b/src/video_check_biz.py index ae069f9..889403b 100644 --- a/src/video_check_biz.py +++ b/src/video_check_biz.py @@ -255,19 +255,26 @@ class VideoCheckBiz(BaseFaceBiz): return None - def batch_process_videos_with_blacklist_detection(self, video_paths: List[str], frame_skip: int = 10, + def batch_process_videos_with_blacklist_detection(self, video_infos: List[Dict], frame_skip: int = 10, suffix: str = "_processed") -> List[Dict]: """ 批量处理视频文件,进行黑名单检测并保存结果 参数: - video_paths: 视频文件路径列表 + video_infos: 视频信息列表,每个元素包含: + { + 'video_id': 视频ID (可选), + 'video_name': 视频名称 (可选), + 'video_path': 视频文件路径 (必需) + } frame_skip: 跳帧数,每隔多少帧处理一帧 suffix: 输出文件后缀 返回: 处理结果列表,每个元素包含: { + 'video_id': 视频ID, + 'video_name': 视频名称, 'original_path': 原视频路径, 'processed_path': 处理后的视频路径, 'has_blacklist_match': 是否检测到黑名单中人脸, @@ -281,15 +288,37 @@ class VideoCheckBiz(BaseFaceBiz): # 确保使用黑名单模式 self.set_list_mode("0") - print(f"🎯 开始批量处理视频: 共{len(video_paths)}个视频") + print(f"🎯 开始批量处理视频: 共{len(video_infos)}个视频") print(f"🔍 检测模式: 黑名单模式, 跳帧数: {frame_skip}") - for i, video_path in enumerate(video_paths, 1): - print(f"\n--- 处理第{i}/{len(video_paths)}个视频: {os.path.basename(video_path)} ---") + for i, video_info in enumerate(video_infos, 1): + video_id = video_info.get('video_id') + video_name = video_info.get('video_name') + video_path = video_info.get('video_path') + + if not video_path: + print(f"❌ 视频信息缺少路径: {video_info}") + results.append({ + 'video_id': video_id, + 'video_name': video_name, + 'original_path': None, + 'processed_path': None, + 'has_blacklist_match': False, + 'detection_count': 0, + 'total_frames_processed': 0, + 'blacklist_matches': [], + 'error': '缺少视频路径' + }) + continue + + video_info_str = f"(ID: {video_id}, 名称: {video_name})" if video_id else "" + print(f"\n--- 处理第{i}/{len(video_infos)}个视频: {os.path.basename(video_path)} {video_info_str} ---") if not os.path.exists(video_path): print(f"❌ 视频文件不存在: {video_path}") results.append({ + 'video_id': video_id, + 'video_name': video_name, 'original_path': video_path, 'processed_path': None, 'has_blacklist_match': False, @@ -304,11 +333,17 @@ class VideoCheckBiz(BaseFaceBiz): result = self._process_single_video_with_detection(video_path, frame_skip, suffix) if result and result['processed_path']: + # 添加视频ID和名称到结果中 + result['video_id'] = video_id + result['video_name'] = video_name results.append(result) status = "✅ 检测到黑名单" if result['has_blacklist_match'] else "⚠️ 未检测到黑名单" - print(f"{status}: {os.path.basename(result['processed_path'])} (匹配次数: {result['detection_count']})") + video_info_str = f"(ID: {video_id}, 名称: {video_name})" if video_id else "" + print(f"{status}: {os.path.basename(result['processed_path'])} (匹配次数: {result['detection_count']}) {video_info_str}") else: error_result = { + 'video_id': video_id, + 'video_name': video_name, 'original_path': video_path, 'processed_path': None, 'has_blacklist_match': False, @@ -318,13 +353,14 @@ class VideoCheckBiz(BaseFaceBiz): 'error': '处理失败' } results.append(error_result) - print(f"❌ 视频处理失败: {os.path.basename(video_path)}") + video_info_str = f"(ID: {video_id}, 名称: {video_name})" if video_id else "" + print(f"❌ 视频处理失败: {os.path.basename(video_path)} {video_info_str}") # 统计结果 success_count = sum(1 for r in results if r.get('processed_path')) blacklist_count = sum(1 for r in results if r.get('has_blacklist_match')) - print(f"\n🎉 批量处理完成: 成功{success_count}/{len(video_paths)}个视频") + print(f"\n🎉 批量处理完成: 成功{success_count}/{len(video_infos)}个视频") print(f"🔍 黑名单检测结果: {blacklist_count}个视频检测到黑名单中人脸") return results