添加契约和网络传输类库
This commit is contained in:
90
SHH.CameraService/HikCameraWorker.cs
Normal file
90
SHH.CameraService/HikCameraWorker.cs
Normal file
@@ -0,0 +1,90 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user