using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.OpenApi.Models; using SHH.CameraSdk; using System.Diagnostics; // ============================================================================== // 1. 基础设施初始化 // ============================================================================== InitHardwareEnv(); using var cameraManager = new CameraManager(); // ============================================================================== // 2. 启动 Web 监控与诊断服务 // ============================================================================== var app = await StartWebMonitoring(cameraManager); // ============================================================================== // 3. 业务编排:配置设备与流控策略 (8+2 演示) // ============================================================================== await ConfigureBusinessLogic(cameraManager); // ============================================================================== // 4. 启动引擎与交互 // ============================================================================== Console.WriteLine("\n[系统] 正在启动全局管理引擎..."); await cameraManager.StartAsync(); Console.WriteLine(">> 系统就绪。访问 http://localhost:5000/swagger 查看诊断信息。"); Console.WriteLine(">> 按 'S' 键退出..."); while (Console.ReadKey(true).Key != ConsoleKey.S) { Thread.Sleep(100); } Console.WriteLine("[系统] 正在停机..."); await app.StopAsync(); // ============================================================================== // Local Functions (方法拆分) // ============================================================================== static void InitHardwareEnv() { Console.WriteLine("=== 工业级视频 SDK 架构测试 (V3.3 分层版) ==="); Console.WriteLine("[硬件] 海康驱动预热中..."); HikNativeMethods.NET_DVR_Init(); HikSdkManager.ForceWarmUp(); // 强制加载 PlayCtrl.dll Console.WriteLine("[硬件] 预热完成。"); } static async Task StartWebMonitoring(CameraManager manager) { var builder = WebApplication.CreateBuilder(); // 注入服务 builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "SHH Camera Diagnostics", Version = "v1" }); }); builder.Services.AddCors(o => o.AddPolicy("AllowAll", p => p.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader())); // 关键:注入单例 Manager builder.Services.AddSingleton(manager); var webApp = builder.Build(); // 配置管道 webApp.UseSwagger(); webApp.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Diagnostics V1")); webApp.UseCors("AllowAll"); webApp.MapControllers(); // 异步启动,不阻塞主线程 _ = webApp.RunAsync("http://0.0.0.0:5000"); Console.WriteLine("[Web] 监控API已启动: http://localhost:5000"); return webApp; } static async Task ConfigureBusinessLogic(CameraManager manager) { // 1. 配置设备 var config = new VideoSourceConfig { Id = 101, Brand = DeviceBrand.HikVision, IpAddress = "172.16.41.206", Port = 8000, Username = "admin", Password = "abcd1234", StreamType = 0 // 主码流 }; manager.AddDevice(config); if (manager.GetDevice(101) is HikVideoSource hikCamera) { // 2. 注册需求 (告诉控制器我要什么) // ---------------------------------------------------- hikCamera.Controller.Register("WPF_Display_Main", 8); // UI 要 8 帧 hikCamera.Controller.Register("AI_Behavior_Engine", 2); // AI 要 2 帧 // 1. 注册差异化需求 (给每个消费者唯一的 AppId) // ---------------------------------------------------- // 模拟:A 进程(如远程预览)带宽有限,只要 3fps hikCamera.Controller.Register("Process_A_Remote", 3); // 模拟:B 进程(如本地大屏)性能强劲,要 8fps hikCamera.Controller.Register("Process_B_Local", 8); // 模拟:AI 引擎 hikCamera.Controller.Register("AI_Engine_Core", 2); // 2. 精准订阅 (Subscribe 替代了 +=) // ---------------------------------------------------- // [消费者 A] - 绝对只会收到 3fps GlobalStreamDispatcher.Subscribe("Process_A_Remote", (deviceId, frame) => { // 这里不需要判断 deviceId,也不需要判断 frame 类型 // 能进这个回调,说明这帧就是专为 Process_A_Remote 准备的 if (deviceId == 101) { Console.WriteLine($"[Process A] 远程推流一帧 (3fps节奏)"); } }); // [消费者 B] - 绝对只会收到 8fps GlobalStreamDispatcher.Subscribe("Process_B_Local", (deviceId, frame) => { if (deviceId == 101) { Console.WriteLine($"[Process B] 本地渲染一帧 (8fps节奏)"); } }); // [消费者 AI] GlobalStreamDispatcher.Subscribe("AI_Engine_Core", (deviceId, frame) => { if (deviceId == 101) { Console.WriteLine($" >>> [AI] 分析一帧..."); } }); } }