Files
Ayay/SHH.CameraSdk/Program.cs

147 lines
5.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<WebApplication> 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] 分析一帧...");
}
});
}
}