C# 视频监控系列(7):服务器端——封装API(下)(1)
前言
????? 寫系列文章的時候[前言]部分變得無言了,可能來得順利了點(diǎn)吧: ) 本章中提供的封裝均是我用笨辦法從<<Hikvision 板卡網(wǎng)絡(luò)開發(fā)包編程手冊V4.7>>和<<DS-4000HC、HCS、HC+、HF、HS、MD卡的Windows編程指南V4.3>>中拷貝出來并參照VC++代碼進(jìn)行整理的,主要是針對HikServer.dll和DS40xxSDK.dll的調(diào)用封裝。
?
注意
?????本系列文章限于學(xué)習(xí)交流,注重過程,由于涉及公司,所以不提供源代碼下載,非常抱歉!!但是請大家放心,核心、實(shí)現(xiàn)以及其他能夠貼出來的代碼我都會貼出來,并且爭取盡所能的回答留言里的每一個問題,感謝大家關(guān)注,歡迎交流 :)
?
系列
???1.?????C# 視頻監(jiān)控系列(1):準(zhǔn)備
?????2.?????C# 視頻監(jiān)控系列(2):客戶端——封裝API
?????3.?????C# 視頻監(jiān)控系列(3):客戶端——連接服務(wù)器
?????4.?????C# 視頻監(jiān)控系列(4):客戶端——音頻接收和抓圖
?????5.?????C# 視頻監(jiān)控系列(5):客戶端——給服務(wù)器端發(fā)送字符串和錄像(數(shù)據(jù)捕獲)
?????6.?????C# 視頻監(jiān)控系列(6):服務(wù)器端——封裝API(上) [HikServer.dll]
?????7.?????C# 視頻監(jiān)控系列(7):服務(wù)器端——封裝API(下) [DS40xxSDK.dll]
?
正文
?????1.?????DS40xxSDK.dll
?
using?System;using?System.Collections.Generic;
using?System.Text;
using?System.Runtime.InteropServices;
using?System.Drawing;
namespace?HikServer.DS40xxSDK
{
????#region?enum
????///?<summary>
????///?板卡類型
????///?</summary>
????public?enum?BOARD_TYPE_DS?:?uint
????{
????????DS400XM?=?0,????????//M卡
????????DS400XH?=?1,????????//H卡
????????DS4004HC?=?2,????????//4004HC
????????DS4008HC?=?3,????????//4008HC
????????DS4016HC?=?4,????????//4016HC
????????DS4001HF?=?5,????????//4001HF
????????DS4004HF?=?6,????????//4004HF
????????DS4002MD?=?7,????????//4002MD
????????DS4004MD?=?8,????????//4004MD
????????DS4016HCS?=?9,????????//4016HCS
????????DS4002HT?=?10,????//4002HT
????????DS4004HT?=?11,????//4004HT
????????DS4008HT?=?12,????//4008HT
????????DS4004HC_PLUS?=?13,????//4004HC+
????????DS4008HC_PLUS?=?14,????//4008HC+
????????DS4016HC_PLUS?=?15,????//4016HC+
????????DS4008HF?=?16,????//4008HF
????????DS4008MD?=?17,????//4008MD
????????DS4008HS?=?18,????//4008HS
????????DS4016HS?=?19,????//4016HS
????????INVALID_BOARD_TYPE?=?0xffffffff,
????}
????///?<summary>
????///?視頻預(yù)覽格式
????///?</summary>
????public?enum?TypeVideoFormat
????{
????????vdfRGB8A_233?=?0x00000001,
????????vdfRGB8R_332?=?0x00000002,
????????vdfRGB15Alpha?=?0x00000004,
????????///?<summary>
????????///?16位RGB視頻壓縮格式
????????///?</summary>
????????vdfRGB16?=?0x00000008,
????????///?<summary>
????????///?24位RGB視頻壓縮格式
????????///?</summary>
????????vdfRGB24?=?0x00000010,
????????vdfRGB24Alpha?=?0x00000020,
????????vdfYUV420Planar?=?0x00000040,
????????///?<summary>
????????///?YUV422視頻壓縮格式
????????///?</summary>
????????vdfYUV422Planar?=?0x00000080,
????????vdfYUV411Planar?=?0x00000100,
????????vdfYUV420Interspersed?=?0x00000200,
????????vdfYUV422Interspersed?=?0x00000400,
????????vdfYUV411Interspersed?=?0x00000800,
????????vdfYUV422Sequence?=?0x00001000,???/*?U0,?Y0,?V0,?Y1:??For?VO?overlay?*/
????????vdfYUV422SequenceAlpha?=?0x00002000,
????????/*?U0,?Y0,?V0,?Y1:??For?VO?overlay,?with?low?bit?for?alpha?blending?*/
????????vdfMono?=?0x00004000,??/*?8?bit?monochrome?*/
????????vdfYUV444Planar?=?0x00008000,
????};
????///?<summary>
????///?視頻制式
????///?</summary>
????public?enum?VideoStandard_t?:?uint
????{
????????///?<summary>
????????///?無視頻信號
????????///?</summary>
????????StandardNone?=?0x80000000,
????????///?<summary>
????????///?NTSC制式
????????///?</summary>
????????StandardNTSC?=?0x00000001,
????????///?<summary>
????????///?PAL制式
????????///?</summary>
????????StandardPAL?=?0x00000002,
????????StandardSECAM?=?0x00000004,
????}?;
????///?<summary>
????///?編碼圖像分辨率
????///?</summary>
????public?enum?PictureFormat_t
????{
????????ENC_CIF_FORMAT?=?0,
????????ENC_QCIF_FORMAT?=?1,
????????ENC_2CIF_FORMAT?=?2,
????????ENC_4CIF_FORMAT?=?3,
????????ENC_QQCIF_FORMAT?=?4,
????????ENC_CIFQCIF_FORMAT?=?5,
????????ENC_CIFQQCIF_FORMAT?=?6,
????????ENC_DCIF_FORMAT?=?7
????};
????///?<summary>
????///?碼流控制方式
????///?</summary>
????public?enum?BitrateControlType_t
????{
????????///?<summary>
????????///?變碼率
????????///?</summary>
????????brCBR?=?0,
????????///?<summary>
????????///?恒定碼率
????????///?</summary>
????????brVBR?=?1,
????};
????public?enum?FrameType_t
????{
????????PktError?=?0,
????????PktIFrames?=?0x0001,
????????PktPFrames?=?0x0002,
????????PktBBPFrames?=?0x0004,
????????PktAudioFrames?=?0x0008,
????????PktMotionDetection?=?0x00010,
????????PktDspStatus?=?0x00020,
????????PktOrigImage?=?0x00040,
????????PktSysHeader?=?0x00080,
????????PktBPFrames?=?0x00100,
????????PktSFrames?=?0x00200,
????????PktSubIFrames?=?0x00400,
????????PktSubPFrames?=?0x00800,
????????PktSubBBPFrames?=?0x01000,
????????PktSubSysHeader?=?0x02000
????};
????#endregion
????#region?struct
????///?<summary>
????///?板卡信息結(jié)構(gòu)體?
????///?</summary>
????public?struct?DS_BOARD_DETAIL
????{
????????///?<summary>
????????///?板卡類型
????????///?</summary>
????????BOARD_TYPE_DS?type;
????????///?<summary>
????????///?序列號
????????///?BYTE?sn[16];????????
????????///?</summary>
????????[MarshalAs(UnmanagedType.ByValArray,?SizeConst?=?16)]
????????byte[]?sn;
????????///?<summary>
????????///?板卡包含的DSP個數(shù)
????????///?</summary>
????????uint?dspCount;
????????///?<summary>
????????///?板卡上第一個DSP的索引
????????///?</summary>
????????uint?firstDspIndex;
????????///?<summary>
????????///?板卡包含的編碼通道個數(shù)
????????///?</summary>
????????uint?encodeChannelCount;
????????///?<summary>
????????///?板卡上第一個編碼通道的索引
????????///?</summary>
????????uint?firstEncodeChannelIndex;
????????///?<summary>
????????///?板卡包含的解碼通道個數(shù)
????????///?</summary>
????????uint?decodeChannelCount;
????????///?<summary>
????????///?板卡上第一個解碼通道的索引
????????///?</summary>
????????uint?firstDecodeChannelIndex;
????????///?<summary>
????????///?板卡包含的視頻輸出通道個數(shù)
????????///?</summary>
????????uint?displayChannelCount;
????????///?<summary>
????????///?板卡上第一個視頻輸出通道的索引
????????///?</summary>
????????uint?firstDisplayChannelIndex;
????????uint?reserved1;
????????uint?reserved2;
????????uint?reserved3;
????????///?<summary>
????????///?硬件版本,format:major.minor.build,major:bit?16-19,minor:?bit?8-15,build:?bit?0-7
????????///?</summary>
????????uint?version;
????}
????///?<summary>
????///?DSP信息結(jié)構(gòu)體?
????///?</summary>
????public?struct?DSP_DETAIL
????{
????????///?<summary>
????????///?此DSP所包含的編碼通道個數(shù)
????????///?</summary>
????????uint?encodeChannelCount;
????????///?<summary>
????????///?此DSP上第一個編碼通道在所有編碼通道中的索引
????????///?</summary>
????????uint?firstEncodeChannelIndex;
????????///?<summary>
????????///?此DSP所包含的解碼通道個數(shù)
????????///?</summary>
????????uint?decodeChannelCount;
????????///?<summary>
????????///?此DSP上第一個解碼通道在所有解碼通道中的索引
????????///?</summary>
????????uint?firstDecodeChannelIndex;
????????///?<summary>
????????///?此DSP包含的顯示通道個數(shù)
????????///?</summary>
????????uint?displayChannelCount;
????????///?<summary>
????????///?此DSP上第一個顯示通道在所有顯示通道中的索引
????????///?</summary>
????????uint?firstDisplayChannelIndex;
????????uint?reserved1;
????????uint?reserved2;
????????uint?reserved3;
????????uint?reserved4;
????}
????///?<summary>
????///?特殊功能結(jié)構(gòu)體
????///?</summary>
????public?struct?CHANNEL_CAPABILITY
????{
????????///?<summary>
????????///?音頻預(yù)覽
????????///?</summary>
????????byte[]?bAudioPreview;
????????///?<summary>
????????///?報警信號
????????///?</summary>
????????byte[]?bAlarmIO;
????????///?<summary>
????????///?看家狗
????????///?</summary>
????????byte[]?bWatchDog;
????}
????///?<summary>
????///?版本信息
????///?</summary>
????public?struct?PVERSION_INFO
????{
????????///?<summary>
????????///?DSP版本號,DSP的BUILD號,用于軟件升級時標(biāo)明該版本的最后修改時間?
????????///?</summary>
????????ulong?DspVersion,?DspBuildNum;
????????///?<summary>
????????///?Driver版本號,Driver的BUILD號,用于軟件升級時標(biāo)明該版本的最后修改時間?
????????///?</summary>
????????ulong?DriverVersion,?DriverBuildNum;
????????///?<summary>
????????///?SDK版本號,SDK的BUILD號,用于軟件升級時標(biāo)明該版本的最后修改時間?
????????///?</summary>
????????ulong?SDKVersion,?SDKBuildNum;
????}
????///?<summary>
????///?顯示窗口內(nèi)的矩形區(qū)域
????///?</summary>
????//[StructLayout(LayoutKind.
????//public?struct?RECT
????//{
????//????public?long?left;
????//????public?long?top;
????//????public?long?right;
????//????public?long?bottom;
????//}
????///?<summary>
????///?幀統(tǒng)計信息結(jié)構(gòu)體?
????///?</summary>
????public?struct?PFRAMES_STATISTICS
????{
????????///?<summary>
????????///?視頻幀
????????///?</summary>
????????ulong?VideoFrames;
????????///?<summary>
????????///?音頻幀
????????///?</summary>
????????ulong?AudioFrames;
????????///?<summary>
????????///?丟失幀
????????///?</summary>
????????ulong?FramesLost;
????????///?<summary>
????????///?丟失的碼流(字節(jié))
????????///?</summary>
????????ulong?QueueOverflow;
????????///?<summary>
????????///?當(dāng)前的幀率(bps)
????????///?</summary>
????????ulong?CurBps;
????}
????///?<summary>
????///?版本信息結(jié)構(gòu)體?
????///?</summary>
????public?struct?PHW_VERSION
????{
????????///?<summary>
????????///?DSP程序的版本號和Build號?
????????///?</summary>
????????ulong?DspVersion,?DspBuildNum;
????????///?<summary>
????????///?驅(qū)動程序的版本號和Build號?
????????///?</summary>
????????ulong?DriverVersion,?DriverBuildNum;
????????///?<summary>
????????///?SDK?的版本號和Build號?
????????///?</summary>
????????ulong?SDKVersion,?SDKBuildNum;
????}
????///?<summary>
????///?系統(tǒng)時間
????///?</summary>
????public?struct?SYSTEMTIME
????{
????????ushort?wYear;
????????ushort?wMonth;
????????ushort?wDayOfWeek;
????????ushort?wDay;
????????ushort?wHour;
????????ushort?wMinute;
????????ushort?wSecond;
????????ushort?wMilliseconds;
????}
????#endregion
????#region?delegate
????///?<summary>
????///?原始圖像流設(shè)置
????///?
????///?typedef?void?(*IMAGE_STREAM_CALLBACK)(UINT?channelNumber,void?*context);
????///?</summary>
????///?<param?name="channelNumber">通道號</param>
????///?<param?name="context">設(shè)備上下文</param>
????public?delegate?void?IMAGE_STREAM_CALLBACK(uint?channelNumber,?IntPtr?context);
????///?<summary>
????///?編碼數(shù)據(jù)流直接讀取回調(diào)函數(shù)
????///?
????///?typedef?int?(*STREAM_DIRECT_READ_CALLBACK)(ULONG?channelNumber,void?*DataBuf,DWORD?Length,int?FrameType,void?*context);
????///?</summary>
????///?<param?name="channelNumber">通道號</param>
????///?<param?name="DataBuf">緩沖區(qū)地址</param>
????///?<param?name="Length">緩沖區(qū)長度</param>
????///?<param?name="FrameType">緩沖區(qū)數(shù)據(jù)幀類型</param>
????///?<param?name="context">設(shè)備上下文</param>
????///?<returns></returns>
????[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
????//public?delegate?int?STREAM_DIRECT_READ_CALLBACK(uint?channelNumber,?byte[]?DataBuf,?uint?Length,?FrameType_t?FrameType,?IntPtr?context);
????public?delegate?int?STREAM_DIRECT_READ_CALLBACK(int?channelNumber,?IntPtr?DataBuf,?int?Length,?FrameType_t?FrameType,?IntPtr?context);
????//public?unsafe?delegate?int?STREAM_DIRECT_READ_CALLBACK(uint?channelNumber,?void?*?DataBuf,?uint?Length,?int?FrameType,?IntPtr?context);
????///?<summary>
????///?直接讀取碼流回調(diào)函數(shù)
????///?
????///?typedef?int?(*STREAM_READ_CALLBACK)(ULONG?channelNumber,?void?*context)?
????///?</summary>
????///?<param?name="channelNumber">通道號</param>
????///?<param?name="context">設(shè)備上下文</param>
????///?<returns></returns>
????public?delegate?int?STREAM_READ_CALLBACK(ulong?channelNumber,?IntPtr?context);
????///?<summary>
????///?移動偵測結(jié)果回調(diào)函數(shù)
????///?
????///?typedef?void?(*MOTION_DETECTION_CALLBACK)(ULONG?channelNumber,?BOOL?bMotionDetected,void?*context)?
????///?</summary>
????///?<param?name="channelNumber">通道號</param>
????///?<param?name="bMotionDetected">
????///?移動偵測發(fā)生標(biāo)志,如果當(dāng)前通道所設(shè)置的移動偵測
????///?區(qū)域內(nèi)產(chǎn)生了移動偵測,則被置為True;如果當(dāng)前通道所設(shè)置的移動偵測區(qū)域內(nèi)自上
????///?一次產(chǎn)生移動偵測后delay秒內(nèi)沒有發(fā)生移動偵測,則被置為False。
????///?</param>
????///?<param?name="context">設(shè)備上下文</param>
????public?delegate?void?MOTION_DETECTION_CALLBACK(ulong?channelNumber,?bool?bMotionDetected,?IntPtr?context);
????///?<summary>
????///?畫圖回調(diào)函數(shù)
????///?
????///?#define?DRAWFUN(x)???void??(CALLBACK*?x)(long?nPort,HDC?hDc,LONG?nUser)?
????///?</summary>
????///?<param?name="nPort">通道號</param>
????///?<param?name="HDC">offscreen表面設(shè)備上下文,相當(dāng)于顯示窗口中的DC</param>
????///?<param?name="nUser">用戶數(shù)據(jù)</param>
????public?delegate?void?DrawFun(long?nPort,?IntPtr?HDC,?long?nUser);
轉(zhuǎn)載于:https://blog.51cto.com/over140/586675
總結(jié)
以上是生活随笔為你收集整理的C# 视频监控系列(7):服务器端——封装API(下)(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [零基础学JAVA]Java SE应用部
- 下一篇: 结构struct(值类型)在实际应用要注