using SHH.Contracts; // 引用契约 namespace SHH.CameraService { /// /// 摄像头工作者 /// 职责:管理海康SDK生命周期,产出 VideoPayload 数据流 /// public class HikCameraWorker : IDisposable { // 定义一个事件:当产生新图片时触发 // 参数是我们的标准快递盒 VideoPayload public event Action OnNewFrame; private bool _isRunning = false; private string _ip; public HikCameraWorker(string ip) { _ip = ip; } /// /// 启动取流 /// public void Start() { if (_isRunning) return; // TODO: 【在此处填入海康 SDK 初始化代码】 // CHCNetSDK.NET_DVR_Init(); // CHCNetSDK.NET_DVR_Login_V40(...); // CHCNetSDK.NET_DVR_RealPlay_V40(...); Console.WriteLine($"[HikWorker] 摄像头 {_ip} 已启动,开始取流..."); _isRunning = true; // 模拟一个后台线程不断产出视频帧 (仅用于演示架构) // 实际中,这里应该是海康的 RealDataCallBack 函数 Task.Run(() => MockCaptureLoop()); } /// /// 停止取流 /// public void Stop() { _isRunning = false; // TODO: 【在此处填入海康 SDK 释放代码】 // CHCNetSDK.NET_DVR_StopRealPlay(...); // CHCNetSDK.NET_DVR_Logout(...); Console.WriteLine($"[HikWorker] 摄像头 {_ip} 已停止。"); } /// /// 模拟抓图循环 (实际开发中请替换为 SDK 回调函数) /// private void MockCaptureLoop() { while (_isRunning) { // 1. 模拟拿到了一张 JPG 图片 (假设 100KB) byte[] mockJpg = new byte[1024 * 100]; // 2. 立即封装成标准包 var payload = new VideoPayload { CameraId = _ip, // 使用 IP 或 ID 作为标记 CaptureTime = DateTime.Now, OriginalWidth = 1920, OriginalHeight = 1080, OriginalImageBytes = mockJpg, // 填入原始数据 TargetImageBytes = null // SDK 只产出原图,还没有处理图 }; // 3. 【核心】触发事件,把包扔给上层 (主程序) // ?.Invoke 确保如果没有人订阅,不会报错 OnNewFrame?.Invoke(payload); // 模拟 25fps (每40ms一帧) Thread.Sleep(40); } } public void Dispose() { Stop(); } } }