首先从https://www.hikvision.com/en/support/download/sdk/下载最新的 SDK
这是我需要与之交互HCNetSDK.dll
以启用音频检测的代码
[DllImport("HCNetSDK.dll", EntryPoint = "NET_DVR_GetDeviceConfig")]
public static extern bool NET_DVR_GetDeviceConfig2(int lUserID, uint dwCommand, uint dwCount, IntPtr lpInBuffer, uint dwInBufferSize, IntPtr lpStatusList, IntPtr lpOutBuffer, uint dwOutBufferSize);
[DllImport("HCNetSDK.dll", EntryPoint = "NET_DVR_SetDeviceConfig")]
public static extern bool NET_DVR_SetDeviceConfig2(int lUserID, uint dwCommand, uint dwCount, IntPtr lpInBuffer, uint dwInBufferSize, IntPtr lpStatusList, IntPtr lpInParamBuffer, uint dwInParamBufferSize);
这在CHCNetSDK.cs
文件中
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct NET_VCA_AUDIO_ABNORMAL
{
public ushort wDecibel;
public byte bySensitivity;
public byte byAudioMode;
public byte byEnable;
public byte byThreshold;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 54, ArraySubType = UnmanagedType.I1)]
public byte[] byRes;
}
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct NET_DVR_AUDIO_EXCEPTION
{
public uint dwSize;
public byte byEnableAudioInException;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3, ArraySubType = UnmanagedType.I1)]
public byte[] byRes1;
public NET_VCA_AUDIO_ABNORMAL struAudioAbnormal;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_DAYS * MAX_TIMESEGMENT_V30, ArraySubType = UnmanagedType.Struct)]
public NET_DVR_SCHEDTIME[] struAlarmSched;
public NET_DVR_HANDLEEXCEPTION_V40 struHandleException;
public uint dwMaxRelRecordChanNum;
public uint dwRelRecordChanNum;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_CHANNUM_V30, ArraySubType = UnmanagedType.U4)]
public uint[] byRelRecordChan;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 32, ArraySubType = UnmanagedType.I1)]
public byte[] byRes2;
}
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct NET_DVR_CHANNEL_GROUP
{
public uint dwSize;
public uint dwChannel;
public uint dwGroup;
public byte ByID;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3, ArraySubType = UnmanagedType.I1)]
public byte[] byRes1;
public byte dwPositionNo;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 56, ArraySubType = UnmanagedType.I1)]
public byte[] byRes;
}
public static CHCNetSDK.NET_DVR_AUDIO_EXCEPTION? GetDevice_AudioDetectConfig(int userID, uint channel)
{
NET_DVR_CHANNEL_GROUP channelGroup = new NET_DVR_CHANNEL_GROUP();
channelGroup.dwSize = (uint)Marshal.SizeOf(channelGroup);
channelGroup.dwChannel = channel;
IntPtr lpInBuffer = Marshal.AllocHGlobal(Marshal.SizeOf(channelGroup));
Marshal.StructureToPtr(channelGroup, lpInBuffer, false);
uint dwInBufferSize = Convert.ToUInt32(channelGroup.dwSize);
NET_DVR_AUDIO_EXCEPTION result = new NET_DVR_AUDIO_EXCEPTION();
result.dwSize = (uint)Marshal.SizeOf(result);
IntPtr lpOutBuffer = Marshal.AllocHGlobal(Marshal.SizeOf(result));
Marshal.StructureToPtr(result, lpOutBuffer, false);
uint dwOutBufferSize = Convert.ToUInt32(result.dwSize);
uint lp = 1;
IntPtr lpStatusList = Marshal.AllocHGlobal(Marshal.SizeOf(lp));
var b = CHCNetSDK.NET_DVR_GetDeviceConfig2(userID, NET_DVR_GET_AUDIOEXCEPTIONPARAM, 1, lpInBuffer, dwInBufferSize, lpStatusList, lpOutBuffer, dwOutBufferSize);
if (b)
{
result = (CHCNetSDK.NET_DVR_AUDIO_EXCEPTION)Marshal.PtrToStructure(lpOutBuffer, typeof(CHCNetSDK.NET_DVR_AUDIO_EXCEPTION));
Marshal.FreeHGlobal(lpInBuffer);
Marshal.FreeHGlobal(lpOutBuffer);
return result;
}
else
{
Marshal.FreeHGlobal(lpInBuffer);
Marshal.FreeHGlobal(lpOutBuffer);
return null;
}
}
public static bool SetDevice_AudioDetectConfig(int userID, int channel, CHCNetSDK.NET_DVR_AUDIO_EXCEPTION config)
{
NET_DVR_CHANNEL_GROUP channelGroup = new NET_DVR_CHANNEL_GROUP();
channelGroup.dwSize = (uint)Marshal.SizeOf(channelGroup);
channelGroup.dwChannel = (uint)channel;
IntPtr lpInBuffer = Marshal.AllocHGlobal(Marshal.SizeOf(channelGroup));
Marshal.StructureToPtr(channelGroup, lpInBuffer, false);
uint dwInBufferSize = Convert.ToUInt32(channelGroup.dwSize);
uint lp = 1;
IntPtr lpStatusList = Marshal.AllocHGlobal(Marshal.SizeOf(lp));
config.dwSize = (uint)Marshal.SizeOf(config);
IntPtr lpInParamBuffer = Marshal.AllocHGlobal(Marshal.SizeOf(config));
Marshal.StructureToPtr(config, lpInParamBuffer, false);
uint dwInParamBufferSize = Convert.ToUInt32(config.dwSize);
bool success = CHCNetSDK.NET_DVR_SetDeviceConfig2(userID, NET_DVR_SET_AUDIOEXCEPTIONPARAM, 1, lpInBuffer, dwInBufferSize, lpStatusList, lpInParamBuffer, dwInParamBufferSize);
Marshal.FreeHGlobal(lpInBuffer);
Marshal.FreeHGlobal(lpInParamBuffer);
return success;
}