/** * Player AI Overlay * Компонент для отображения real-time AI анализа поверх видео */ import { Activity, AlertCircle, Eye, Sparkles } from "lucide-react" import { useEffect, useState } from "react" import { Badge } from "@/components/ui/badge" import { Progress } from "@/components/ui/progress" import { cn } from "@/lib/utils" import { usePlayerAIAnalysis } from "../hooks/use-player-ai-analysis" interface PlayerAIOverlayProps { className?: string showObjects?: boolean showSceneInfo?: boolean showMoments?: boolean } export function PlayerAIOverlay({ className, showObjects = true, showSceneInfo = true, showMoments = true, }: PlayerAIOverlayProps) { const aiAnalysis = usePlayerAIAnalysis() const [isVisible, setIsVisible] = useState(false) // Показываем оверлей только когда идет анализ useEffect(() => { setIsVisible(aiAnalysis.state.isAnalyzing) }, [aiAnalysis.state.isAnalyzing]) if (!isVisible) return null const currentScene = aiAnalysis.getCurrentSceneInfo() const objects = aiAnalysis.getObjectsInFrame() const upcomingMoments = aiAnalysis.getUpcomingMoments(5) // Следующие 5 секунд return (
{/* Индикатор анализа */}
AI анализ активен
{/* Информация о сцене */} {showSceneInfo && currentScene && (
Сцена: {currentScene.type}
)} {/* Обнаруженные объекты */} {showObjects && objects.length > 0 && (
Объекты:
{objects.slice(0, 5).map((obj, idx) => ( {obj.label} ({Math.round(obj.confidence * 100)}%) ))} {objects.length > 5 && ( +{objects.length - 5} )}
)} {/* Предстоящие моменты */} {showMoments && upcomingMoments && upcomingMoments.length > 0 && (
Ключевые моменты:
{upcomingMoments.slice(0, 3).map((moment) => (
{formatTime(moment.timestamp)}: {moment.description}
))}
)} {/* Боковые границы для обнаруженных объектов */} {showObjects && objects.map((obj, idx) => (
{obj.label}
))}
) } // Форматирование времени function formatTime(seconds: number): string { const mins = Math.floor(seconds / 60) const secs = Math.floor(seconds % 60) return `${mins}:${secs.toString().padStart(2, "0")}` }