Files
Ayay/SHH.CameraService/HikCameraWorker.cs

90 lines
2.8 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 SHH.Contracts; // 引用契约
namespace SHH.CameraService
{
/// <summary>
/// 摄像头工作者
/// 职责管理海康SDK生命周期产出 VideoPayload 数据流
/// </summary>
public class HikCameraWorker : IDisposable
{
// 定义一个事件:当产生新图片时触发
// 参数是我们的标准快递盒 VideoPayload
public event Action<VideoPayload> OnNewFrame;
private bool _isRunning = false;
private string _ip;
public HikCameraWorker(string ip)
{
_ip = ip;
}
/// <summary>
/// 启动取流
/// </summary>
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());
}
/// <summary>
/// 停止取流
/// </summary>
public void Stop()
{
_isRunning = false;
// TODO: 【在此处填入海康 SDK 释放代码】
// CHCNetSDK.NET_DVR_StopRealPlay(...);
// CHCNetSDK.NET_DVR_Logout(...);
Console.WriteLine($"[HikWorker] 摄像头 {_ip} 已停止。");
}
/// <summary>
/// 模拟抓图循环 (实际开发中请替换为 SDK 回调函数)
/// </summary>
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();
}
}
}