增加云台移动、缩放、聚集、光圈、校时、重启对 AiVideo 项目的支持
This commit is contained in:
@@ -1,4 +1,6 @@
|
||||
namespace SHH.CameraSdk.HikFeatures;
|
||||
using Serilog;
|
||||
|
||||
namespace SHH.CameraSdk.HikFeatures;
|
||||
|
||||
public class HikPtzProvider : IPtzFeature
|
||||
{
|
||||
@@ -9,6 +11,15 @@ public class HikPtzProvider : IPtzFeature
|
||||
_context = context;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 判断该动作是否支持速度参数
|
||||
/// </summary>
|
||||
private static bool IsSpeedSupported(PtzAction action)
|
||||
{
|
||||
// Optimized: 方向和缩放支持速度,其余(雨刷/聚焦/光圈)为开关量或标准调节
|
||||
return action <= PtzAction.ZoomOut;
|
||||
}
|
||||
|
||||
public async Task PtzControlAsync(PtzAction action, bool stop, int speed)
|
||||
{
|
||||
int userId = _context.GetUserId();
|
||||
@@ -17,10 +28,18 @@ public class HikPtzProvider : IPtzFeature
|
||||
// 1. 映射指令
|
||||
uint hikCommand = action switch
|
||||
{
|
||||
PtzAction.Up => HikNativeMethods.TILT_UP,
|
||||
PtzAction.Down => HikNativeMethods.TILT_DOWN,
|
||||
PtzAction.Left => HikNativeMethods.PAN_LEFT,
|
||||
PtzAction.Up => HikNativeMethods.TILT_UP,
|
||||
PtzAction.Right => HikNativeMethods.PAN_RIGHT,
|
||||
PtzAction.Down => HikNativeMethods.TILT_DOWN,
|
||||
|
||||
PtzAction.LeftUp => HikNativeMethods.UP_LEFT, // 海康 SDK: 左上
|
||||
PtzAction.LeftDown => HikNativeMethods.DOWN_LEFT, // 海康 SDK: 左下
|
||||
PtzAction.RightUp => HikNativeMethods.UP_RIGHT, // 海康 SDK: 右上
|
||||
PtzAction.RightDown => HikNativeMethods.DOWN_RIGHT, // 海康 SDK: 右下
|
||||
|
||||
PtzAction.Auto => HikNativeMethods.PAN_AUTO,
|
||||
|
||||
PtzAction.ZoomIn => HikNativeMethods.ZOOM_IN,
|
||||
PtzAction.ZoomOut => HikNativeMethods.ZOOM_OUT,
|
||||
PtzAction.FocusNear => HikNativeMethods.FOCUS_NEAR,
|
||||
@@ -36,19 +55,28 @@ public class HikPtzProvider : IPtzFeature
|
||||
// 2. 转换停止标志 (海康: 0=开始, 1=停止)
|
||||
uint dwStop = stop ? 1u : 0u;
|
||||
|
||||
// 3. 限制速度范围 (1-7)
|
||||
uint dwSpeed = (uint)Math.Clamp(speed, 1, 7);
|
||||
|
||||
// 4. 调用 SDK
|
||||
// 3. 调用 SDK
|
||||
await Task.Run(() =>
|
||||
{
|
||||
// Channel 默认为 1
|
||||
bool result = HikNativeMethods.NET_DVR_PTZControlWithSpeed_Other(userId, 1, hikCommand, dwStop, dwSpeed);
|
||||
bool result;
|
||||
// Optimized: 接口分流逻辑,确保不同类型的动作调用正确的 SDK 接口
|
||||
if (IsSpeedSupported(action))
|
||||
{
|
||||
uint dwSpeed = (uint)Math.Clamp(speed, 1, 7);
|
||||
result = HikNativeMethods.NET_DVR_PTZControlWithSpeed_Other(userId, 1, hikCommand, dwStop, dwSpeed);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 对于雨刷、聚焦、光圈,使用不带速度的接口
|
||||
result = HikNativeMethods.NET_DVR_PTZControl_Other(userId, 1, hikCommand, dwStop);
|
||||
}
|
||||
|
||||
if (!result)
|
||||
{
|
||||
// 这里通常不抛异常,因为云台繁忙或到头是常态,记录日志即可
|
||||
// Console.WriteLine($"PTZ Error: {HikNativeMethods.NET_DVR_GetLastError()}");
|
||||
// Modified: 统一记录到 D:\Logs
|
||||
uint errorCode = HikNativeMethods.NET_DVR_GetLastError();
|
||||
Log.Warning("Ayay.AiVideo: PTZ {Action} failed. Stop: {Stop}, ErrorCode: {ErrorCode}",
|
||||
action, stop, errorCode);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user