-
c#视频监控系列(7)服务器端—封装API下DS40xxSDK.dll下
#region 3.5.3.3开启及停止录像
/// <summary>
/// 3.5.3.3.1启动主通道编码数据流捕获
/// 说 明: 启动主通道编码数据流捕获。用户程序可以使用直接读取方式,使用
/// StreamDirectReadCallback回调函数直接对数据流进行处理;也可以与H卡一样,通过消息
/// 读取方式,等SDK向用户程序发送在RegisterMessageNotifyHandle中注册的消息,用户程
/// 序使用ReadStreamData来读取数据流。
///
/// int __stdcall StartVideoCapture(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int StartVideoCapture(IntPtr hChannelHandle);
/// <summary>
/// 3.5.3.3.2停止主通道编码数据流捕获
/// 说 明: 停止主通道编码数据流捕获
///
/// int __stdcall StopVideoCapture(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int StopVideoCapture(IntPtr hChannelHandle);
/// <summary>
/// 3.5.3.3.3启动子通道编码数据流捕获
/// 说 明: 启动子通道编码数据流捕获
///
/// int __stdcall StartSubVideoCapture(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int StartSubVideoCapture(IntPtr hChannelHandle);
/// <summary>
/// 3.5.3.3.4停止子通道编码数据流捕获
/// 说 明: 停止子通道编码数据流捕获
///
/// int __stdcall StopSubVideoCapture(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <returns>成功返回0;失败返回错误号 </returns>
[DllImport("DS40xxSDK.dll")]
public static extern int StopSubVideoCapture(IntPtr hChannelHandle);
#endregion
#endregion
#endregion
#endregion
#region 3.6移动侦测
// 释 义: 移动侦测
//DS4000HC提供运动强度信息来处理运动检测,设置移动侦测区域时以32*32像素块为
//单位,按4CIF(704*576)分辨率计算,每行有22个块(704/32),PAL时18行(576/32),
//NTSC时15行(480/32),与编码格式无关。经过测试,这种方法比H卡提高了灵敏度和可
//靠性,并简化了返回的数据,返回的值是18个DWORD,对应屏幕高度576/32=18行(PAL),
//每个DWORD的0-21位对应屏幕宽度704/32=22, 其中1为运动,0为静止,也可以调用原有
//MotionAnalyzer分析结果
//4.0版本的SDK新增了接口函数SetupMotionDetectionEx,提供了更灵活的功能,并且
//简化了用户的工作量。
#region 3.6.1设置方式一
// 设置移动侦测相关参数并启动移动侦测后,运动检测信息会通过数据流传送,用户程序
//发现PktMotionDetection帧类型时,可调用MotionAnalyzer来处理运动信息,结果由
//MotionAnalyzer在iResult中返回。也可以按照SDK提供的数据格式来自己分析,运动信息格
//式参见移动侦测释义。
/// <summary>
/// 3.6.1.1设置移动侦测灵敏度
/// 说 明: 调整运动分析的灵敏度,支持动态调整,此函数决定DSP全局运动分析的灵敏度。
/// 而MotionAnalyzer的iThreshold则主要用于分析指定区域的运动统计结果。
///
/// int __stdcall AdjustMotionDetectPrecision(HANDLE hChannelHandle, int iGrade, int iFastMotionDetectFps, int iSlowMotionDetectFps)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="iGrade">
/// 运动分析灵敏度等级,取值范围0-6,0级最灵敏,6级最迟钝,推荐值为2。
/// 将iGrade和“0x80000000“做”或“操作,会对移动侦测启用自适应分析。
/// </param>
/// <param name="iFastMotionDetectFps">高速运动检测的帧间隔,取值范围0-12,0表示不作高速运动检测,通常值取为2</param>
/// <param name="iSlowMotionDetectFps">低速运动检测的帧间隔,取值范围13以上,当取值为0时,不作低速运动检测</param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int AdjustMotionDetectPrecision(IntPtr hChannelHandle, int iGrade, int iFastMotionDetectFps, int iSlowMotionDetectFps);
/// <summary>
/// 3.6.1.2设置移动侦测区域范围及个数
/// 说 明: 设置运动检测区域;当收到运动信息的数据帧(PktMotionDetection)时,调用
/// MotionAnalyzer;MotionAnalyzer会根据在SetupMotionDetection中的设置来分析每个需要
/// 检测的区域,当某区域的阀值(MotionAnalyzer的iThreshold)到达时,会在返回的区域数组
/// (MotionAnalyzer的iResult)标明最后的判断;矩形框范围是(0,0,703,575)
///
/// int __stdcall SetupMotionDetection(HANDLE hChannelHandle, RECT *RectList, int iAreas)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="RectList">矩形框数组</param>
/// <param name="iAreas">矩形框个数,最大值为100</param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetupMotionDetection(IntPtr hChannelHandle, ref Rectangle RectList, int iAreas);
/// <summary>
/// 3.6.1.3移动侦测分析
/// 说 明: 动态监测分析,移动侦测由DSP完成,DSP送出的IPktMotionData帧就是已经
/// 分析好的运动信息,区域的运动分析由主机完成,数据源由码流中的PktMotionData帧提供,
/// 结果在iResult中说明,2.0以上版本的运动分析基于DSP提供的运动强度,不再使用运动
/// 矢量,其灵敏度及可靠性有大幅提高,用户软件可使用由码流提供的运动强度信息来自己分
/// 析或调用该函数来进行区域分析
///
/// 函 数: int __stdcall MotionAnalyzer(HANDLE hChannelHandle, char *MotionData, int iThreshold, int *iResult)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="MotionData">运动矢量指针</param>
/// <param name="iThreshold">判断运动程度的伐值</param>
/// <param name="iResult">按照伐值指定的强度分析后的结果数组。数组的大小在SetupMotionDetection的numberOfAreas指定,如果某数组单元的值大于零则表明有该区域有该值表明的运动强度</param>
/// <returns>成功返回0;失败返回错误号 </returns>
[DllImport("DS40xxSDK.dll")]
public static extern int MotionAnalyzer(IntPtr hChannelHandle, char[] MotionData, int iThreshold, ref int iResult);
#endregion
#region 3.6.2设置方式二
/// <summary>
/// 3.6.2.1设置移动侦测(扩展)
/// 说 明: 设置移动侦测,这种设置方式可替代设置方式一中3个函数的共同作用,在这种情况下,DSP将不再反馈移动侦测帧。
/// 参数delay:画面静止之后的延时时间,单位为秒,若在该延时时间内没有产生
/// 移动侦测,则将回调函数MotionDetectionCallback之中的参数bMotionDetected标志为False,
/// 若在该延时时间之内,在当前所设置的区域内产生移动侦测,则bMotionDetected被标志为
/// True,并且在产生移动侦测之后的delay时间内,DSP不会对在此时间段之内的视频帧进行
/// 移动侦测分析,因此DSP和主机都省却了在此时间段对产生的视频运动进行频繁判断和分
/// 析。直至超过了此delay秒延时时间,DSP才会对此时刻的视频进行判断,若产生了移动侦
/// 测,则回调函数中的bMotionDetected被再次标志为True,否则标志为False。
///
///
/// 函 数: int __stdcall SetupMotionDetectionEx(HANDLE hChannelHandle,int iGrade, int iFastMotionDetectFps, int iSlowMotionDetectFps,UINT delay,RECT *RectList, int iAreas, MOTION_DETECTION_CALLBACK MotionDetectionCallback,int reserved)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="iGrade">
/// 运动分析灵敏度等级,取值范围0-6,0级最灵敏,6级最迟钝,
/// 推荐值2。将iGrade和“0x80000000“做”或“操作,会对移动侦测启用
/// 自适应分析。
/// </param>
/// <param name="iFastMotionDetectFps">高速运动检测的帧间隔,取值范围0-12,0表示不作高速运动检测,通常值取为2</param>
/// <param name="iSlowMotionDetectFps">低速运动检测的帧间隔,取值范围13以上,当取值为0时,不作低速运动检测</param>
/// <param name="delay">前一次移动帧测产生后的延时时间</param>
/// <param name="RectList">进行移动侦测的矩形框数组</param>
/// <param name="iAreas">矩形框个数(最大个数为100)</param>
/// <param name="MotionDetectionCallback">移动侦测结果回调函数 </param>
/// <param name="reserved">保留参数</param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetupMotionDetectionEx(IntPtr hChannelHandle, int iGrade, int iFastMotionDetectFps, int iSlowMotionDetectFps, uint delay, ref Rectangle RectList, int iAreas, MOTION_DETECTION_CALLBACK MotionDetectionCallback, int reserved);
#endregion
#region 3.6.3启动及停止移动侦测
/// <summary>
/// 3.6.3.1启动移动侦测
/// 说 明: 启动移动侦测。
/// 注意:移动侦测和编码相互独立,用户程序可在不启动编码的情况下进行运动检测
///
/// int __stdcall StartMotionDetection(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int StartMotionDetection(IntPtr hChannelHandle);
/// <summary>
/// 3.6.3.2停止移动侦测
/// 说 明: 停止移动侦测
///
/// int __stdcall StopMotionDetection(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle"></param>
/// <returns></returns>
[DllImport("DS40xxSDK.dll")]
public static extern int StopMotionDetection(IntPtr hChannelHandle);
#endregion
#endregion
#region 3.7视频信息叠加
#region 3.7.1信息叠入视频编码(OSD、LOGO、MASK)
//注意:使用此部分函数时,在录像文件中,包含所叠加的信息
#region 3.7.1.1 OSD
/// <summary>
/// 3.7.1.1.1设置OSD显示模式
///
/// 函 数: int __stdcall SetOsdDisplayMode(HANDLE hChannelHandle, int Brightness, BOOL Translucent, int parameter, USHORT *Format1, USHORT *Format2)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="Brightness">OSD显示亮度。0最暗,255最亮</param>
/// <param name="Translucent">OSD图像是否做半透明处理</param>
/// <param name="parameter">Bit0:是否自动进行颜色翻转 Bit16-23垂直放大倍数 Bit24-31水平 </param>
/// <param name="Format1">描述字符叠加的位置和次序的格式</param>
/// <param name="Format2"></param>
#region USHORT *Forma1, *Format2
//USHORT *Forma1, *Format2
//描述字符叠加的位置和次序的格式串,具体定义如下:
//USHORT X, USHORT Y, CHAR0, CHAR1, CHAR2,… CHARN, NULL
// 其中X,Y 是该字串在标准4CIF图象的起始位置,X必须是16的倍数,Y可以在图
//象高度内取值即(0-575)PAL 、(0-479)NTSC;CHARN也是USHORT型的参数,可以
//是ASCII码也可以是汉字,当想要显示当前时间时,可以指定为固定的时间定义值,其值
//如下:
//_OSD_YEAR4 四位的年显示,如2004
//_OSD_YEAR2 两位的年显示,如02
//_OSD_MONTH3 英文的月显示,如 Jan
//_OSD_MONTH2 两位阿拉伯数字的月显示,如07
//_OSD_DAY 两位的阿拉伯数字的日显示,如31
//_OSD_WEEK3 英文的星期显示,如Tue
//_OSD_CWEEK1 中文的星期显示,如星期二
// _OSD_HOUR24 24小时的时钟显示,如18
//_OSD_HOUR12 12小时的时钟显示,如AM09或PM09
//_OSD_MINUTE 两位分钟的显示
//_OSD_SECOND 两位秒的显示
//在格式字符串的最后必须以NULL(0)结尾,否则会显示错误的内容。
//字符串和时间显示可以在FORMAT1 也可以在FORMAT2,也可以混合在一起,但不得超
//过一行4CIF 图象的宽度。
//例如:
//要显示位置在16,19的字符串“办公室”的格式字符串如下:
// USHORT Format[] = {16, 19, ‘办’,’公’,’室’, ‘’};
//要显示位置在8, 3的时间字符串可以如下:
// USHORT Format[]={8, 3, _OSD_YEAR4, ‘年’,_OSD_MONTH2,’月’,_OSD_DAY,
//‘日’,_OSD_HOUR24,’:’, _OSD_MINUTE, ‘:’, _OSD_SECOND, ‘’};
//如果只想显示其中一行,则将起始的字符串定义如下:
// USHORT FormatNoDisplay[]={0, 0, ‘’};
//返回值: 成功返回0;失败返回错误号
//说 明: OSD字符中,ASCII字符的标准分辨率为8×16,汉字的标准分辨率为16×16。
//由于在编码之前需要对原始图像进行缩小才能产生编码所需的分辨率,此时为了保证在
//缩小后的编码图像上能够看清OSD字符,就需要先把OSD字符放大以后再叠加在4CIF的
//原始图像上。
//如果不指定放大倍数(采用默认设置),则系统会根据该通道录像的分辨率自动设置,
//这样在任何分辨率下都可以保证回放时能够看清OSD内容,但是这会导致OSD的大小和位
//置在原始图像中不固定。
//为了避免上面的现象,用户可以指定OSD的大小。例如,如果应用程序想以CIF、DCIF、
//2CIF、4CIF的分辨率录像,这时候可以将放大系数设为2、2,此时OSD的位置始终固定,
//但在不同的编码分辨率下,OSD字符的分辨率也不同,所以需要特别注意。如果此时使用
//QCIF录像,则OSD字符会变得模糊不清(因为QCIF要对图像进行1/4缩小,而对OSD
//字符只进行了2倍的放大)。具体配置详见下表:
//水平放大倍数 垂直放大倍数 适合的录像分辨率 说明
//1 1 4CIF 其它分辨率下会模糊
//1 2 2CIF 小于2CIF时无法分辩
//2 2 CIF、DCIF QCIF时无法分辩
//4 4 QCIF 在其它分辨率下字符会很大
//任意系数为0 自动设置(默认值)
//其它无效值 按水平2、垂直2处理
//注意:因为字符的位置会随着不同的录像分辨率而改变,在位置改变后,某些OSD字符的
//位置可能会超出图像的范围,此时这些字符将无法显示,但系统并不会返回错误。
#endregion
/// <returns></returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetOsdDisplayMode(IntPtr hChannelHandle, int Brightness, bool Translucent, int parameter, ushort[] Format1, ushort[] Format2);
/// <summary>
/// 3.7.1.1.2设置OSD显示模式(扩展)
/// 说 明: 此函数为SetOsdDisplayMode的扩展,SetOsdDisplayModeEx函数支持最多8行OSD字符串的显示。
///
/// int __stdcall SetOsdDisplayModeEx(HANDLE hChannelHandle,int color, BOOL Translucent,int param,int nLineCount,USHORT **Format)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="Brightness">OSD显示亮度。0最暗,255最亮</param>
/// <param name="Translucent">OSD图像是否做半透明处理</param>
/// <param name="param">Bit0:是否自动进行颜色翻转 Bit16-23垂直放大倍数 Bit24-31水平放大倍数</param>
/// <param name="nLineCount">OSD显示的行数,最多为8行</param>
/// <param name="Format">多行字符显示
/// USHORT **Format;多行字符显示,描述字符叠加的位置和次序的格式串,
/// 其中每一行的第一元素X和第二元素Y 是该字串在标准4CIF图象的起始位置,X必须是
/// 16的倍数,Y可以在图象高度内取值即(0-575)PAL 、(0-479)NTSC;可以是ASCII码
/// 也可以是汉字,当想要显示当前时间时,可以指定为固定的时间定义值,其值如下:
/// _OSD_YEAR4 四位的年显示,如2004
/// _OSD_YEAR2 两位的年显示,如02
/// _OSD_MONTH3 英文的月显示,如 Jan
/// _OSD_MONTH2 两位阿拉伯数字的月显示,如07
/// _OSD_DAY 两位的阿拉伯数字的日显示,如31
/// _OSD_WEEK3 英文的星期显示,如Tue
/// _OSD_CWEEK1 中文的星期显示,如星期二
/// _OSD_HOUR24 24小时的时钟显示,如18
/// _OSD_HOUR12 12小时的时钟显示,如AM09或PM09
/// _OSD_MINUTE 两位分钟的显示
/// _OSD_SECOND 两位秒的显示
/// 在格式字符串的每一行最后一个元素必须以NULL(0)结尾,否则会显示错误的内容。
/// 返回值: 成功返回0;失败返回错误号。
/// 说 明: 此函数为SetOsdDisplayMode的扩展,SetOsdDisplayModeEx函数支持最多8行
/// OSD字符串的显示。
/// </param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetOsdDisplayModeEx(IntPtr hChannelHandle, int Brightness, bool Translucent, int param, int nLineCount, char[] Format);
/// <summary>
/// 3.7.1.1.3设置OSD显示
/// 说 明: 设置OSD显示,将当前的系统时间年月日星期时分秒等信息叠加在视频之上,并可作透明处理。
///
/// int __stdcall SetOsd(HANDLE hChannelHandle, BOOL Enable)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="Enable">OSD是否显示</param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetOsd(IntPtr hChannelHandle, bool Enable);
#endregion
#region 3.7.1.2 LOGO
/// <summary>
/// 3.7.1.2.1数据格式转换
/// 说 明: 将24位bmp格式图像转换为yuv422格式图像。
/// 注意:bmp位图的长宽必须为16的倍数,图像尺寸最大支持128*128,4.3版本SDK图像尺寸扩大为256*128
///
/// 函 数: int __stdcall LoadYUVFromBmpFile(char *FileName, unsigned char *yuv, int BufLen, int *Width, int *Height)
/// </summary>
/// <param name="FileName">文件名</param>
/// <param name="yuv">YUV422图像指针 </param>
/// <param name="BufLen">YUV422图像缓存大小</param>
/// <param name="Width">返回的YUV422图像的宽度</param>
/// <param name="Height">返回的YUV422图像的高度</param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int LoadYUVFromBmpFile(string FileName, string yuv, int BufLen, ref int Width, ref int Height);
/// <summary>
/// 3.7.1.2.2设置LOGO显示模式
/// 说 明: 设置LOGO显示模式
///
/// 函 数: int __stdcall SetLogoDisplayMode(HANDLE hChannelHandle, COLORREF ColorKey, BOOL Translucent, int TwinkleInterval)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="ColorKey">LOGO图像中该颜色在显示时将会全透明</param>
/// <param name="Translucent">LOGO图像是否作半透明处理</param>
/// <param name="TwinkleInterval">闪烁的时间设置,由16进制数表示为0xXXYY,其中XX为显示的秒数,YY为停止的秒数,XXYY均为0时正常显示。</param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetLogoDisplayMode(IntPtr hChannelHandle, Color ColorKey, bool Translucent, int TwinkleInterval);
/// <summary>
/// 3.7.1.2.3设置LOGO显示位置及数据
/// 说 明: 设置LOGO图像位置及数据,用户程序可先调用LoadYUVFromBmpFile将24
/// 位bmp文件中转化为YUV422格式数据,,透明处理由DSP完成。
/// 注意:HS卡的x,w需要按照32对齐,y,h仍为8对齐。
///
/// 函 数: int __stdcall SetLogo(HANDLE hChannelHandle, int x, int y, int w, int h, unsigned char *yuv)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="x">LOGO左上角x坐标位置,取值范围0-703,需按16对齐</param>
/// <param name="y">LOGO左上角y坐标位置,取值范围0-575,需按8对齐</param>
/// <param name="w">LOGO宽度,最大值为256,需按16对齐,此宽度必须和LOGO图片的宽度相一致</param>
/// <param name="h">LOGO高度,最大值为128,需按8对齐</param>
/// <param name="yuv">LOGO图片指针(yuv422格式)</param>
/// <returns>成功返回0;失败返回错误号 </returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetLogo(IntPtr hChannelHandle, int x, int y, int w, int h, string yuv);
/// <summary>
/// 3.7.1.2.4停止LOGO显示
/// 说 明: 停止LOGO显示
///
/// int __stdcall StopLogo(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int StopLogo(IntPtr hChannelHandle);
#endregion
#region 3.7.1.3视频遮挡MASK
/// <summary>
/// 3.7.1.3.1设置屏幕遮挡
/// 说 明: 设置屏幕遮挡,最多可以设置32个
///
/// int __stdcall SetupMask(HANDLE hChannelHandle, RECT *RectList, int iAreas)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="RectList">矩形框数组,宽度范围0-704,按16对齐;高度范围0-576,按</param>
/// <param name="iAreas">矩形框个数</param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetupMask(IntPtr hChannelHandle, ref Rectangle RectList, int iAreas);
/// <summary>
/// 3.7.1.3.1停止屏幕遮挡
/// 说 明: 停止屏幕遮挡
///
/// int __stdcall StopMask(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int StopMask(IntPtr hChannelHandle);
#endregion
#endregion
#region 3.7.2仅在预览画面上叠加信息
// 注意:当采用overlay预览模式时,可在overlay表面上直接叠加字符或画图,当采用offscreen
//预览模式时,需要调用画图回调函数进行信息叠加,所叠加信息仅在预览屏幕上显示,不进
//入编码。
//Offscreen预览模式下画图回调函数
/// <summary>
/// 3.7.2.1注册画图回调函数
/// 说 明: 获取当前offscreen表面的device context,HC系列板卡采用创建offscreen的方
/// 式,所以在窗口客户区中的DC中无法画图或者鞋子,必须使用DirectDraw里的offscreen表面的DC。
/// 注意:如果采用overlay预览模式,则直接在overlay表面画图即可,无需调用此函数
///
/// int __stdcall RegisterDrawFun(DWORD nport, DRAWFUN(DrawFun),LONG nUser)
/// </summary>
/// <param name="nport">通道号索引</param>
/// <param name="df">画图回调函数</param>
/// <param name="nUser">用户数据</param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int RegisterDrawFun(ulong nport, DrawFun df, long nUser);
//public static extern int RegisterDrawFun(ulong nport, DrawFun df, IntPtr nUser);
/// <summary>
/// 3.7.2.2停止画图回调
/// 说 明: 停止画图回调。在某些显卡上进行画图回调,会使得CPU的利用率变高,所以可以在适当的时候(画图回调结束)停止调用。
///
/// int __stdcall StopRegisterDrawFun(DWORD nport)
/// </summary>
/// <param name="nport">通道索引</param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int StopRegisterDrawFun(ulong nport);
#endregion
#endregion
#region 3.8音频
/// <summary>
/// 3.8.1设置音频预览
/// 说 明: 设置音频预览与否,同一时间,系统只支持一路音频预览。需要将4针线和声卡音频输入口联接。
///
/// int __stdcall SetAudioPreview(HANDLE hChannelHandle, BOOL bEnable)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="bEnable">使能</param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetAudioPreview(IntPtr hChannelHandle, bool bEnable);
/// <summary>
/// 3.8.2获取音频输入音量幅度
/// 说 明: 获取当前通道的现场声音幅度。
/// 注意:当无声音输入时因背景噪声的原因返回值并不为0。
///
/// int __stdcall GetSoundLevel(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <returns>当前通道的音频输入幅度</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int GetSoundLevel(IntPtr hChannelHandle);
#endregion
#region 3.9其他
/// <summary>
/// 3.9.1复位DSP
/// 此函数目前无效
/// 说 明: 复位某个DSP,注意请谨慎调用该函数,请确定DSP故障无法软件恢复时再关闭相关的资源后复位DSP。
///
/// int __stdcall ResetDSP(int DspNumber);
/// </summary>
/// <param name="DspNumber">DSP索引号</param>
/// <returns> 成功返回0;失败返回错误号 </returns>
[DllImport("DS40xxSDK.dll")]
public static extern int ResetDSP(int DspNumber);
/// <summary>
/// 3.9.2设置看门狗
/// 说 明: 设置看门狗。DS-4016HCS提供4pin复位接口,用户需要把主机机箱的Reset
/// 接线连接到板卡上相邻的2pin复位接口,板卡上的另外相邻的2pin接口连接到主板的Reset,
/// 这样就可以实现对上层软件和系统中所有压缩板卡的运行状态监控。
///
/// int __stdcall SetWatchDog(UINT boardNumber,BOOL bEnable)
/// </summary>
/// <param name="boardNumber">板卡索引</param>
/// <param name="bEnable">使能</param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetWatchDog(uint boardNumber, bool bEnable);
#region 3.9.3码流数字水印校验
/// <summary>
/// 3.9.3.1设置主通道数字水印校验
/// 说 明: 此函数不支持动态设置,设置后会在下一次启动录像后生效。
///
/// int __stdcall SetChannelStreamCRC(HANDLE hChannel,BOOL bEnable)
/// </summary>
/// <param name="hChannel">通道句柄</param>
/// <param name="bEnable">使能</param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetChannelStreamCRC(IntPtr hChannel, bool bEnable);
/// <summary>
/// 3.9.3.2设置子通道数字水印校验
/// 说 明: 此函数不支持动态设置,设置后会在下一次启动录像后生效。
///
/// int __stdcall SetSubChannelStreamCRC(HANDLE hChannel,BOOL bEnable)
/// </summary>
/// <param name="hChannel">通道句柄</param>
/// <param name="bEnable">使能</param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetSubChannelStreamCRC(IntPtr hChannel, bool bEnable);
#endregion
#endregion
#endregion
}
}
修改记录
1. 2009-3-16,修改前本文备份:http://file.ddvip.com/2009_04/1239186012_ddvip_4371.rar
1.1 去掉了《4.解码卡API 》,暂时用不上也占文章太多行数,暂时去掉了。
1.2 GetSDKVersion 结构体一般需要加ref
VC++:int __stdcall GetSDKVersion(PVERSION_INFO VersionInfo)
C#[改前]:public static extern int GetSDKVersion(PVERSION_INFO VersionInfo);
C#[改后]:public static extern int GetSDKVersion(ref PVERSION_INFO VersionInfo);
1.3 抓图函数GetJpegImage ,没注意参数Size前面的*
VC++:int __stdcall GetJpegImage(HANDLE hChannelHandle,UCHAR *ImageBuf, ULONG *Size,UINT nQuality)
C#[改前]:public static extern int GetJpegImage(IntPtr hChannelHandle, byte[] ImageBuf, ulong Size, uint nQuality);
C#[改后]:public static extern int GetJpegImage(IntPtr hChannelHandle, byte[] ImageBuf, out int Size, uint nQuality);
1.4 抓图函数GetOriginalImage,没注意参数Size前面的*
VC++:int __stdcall GetOriginalImage(HANDLE hChannelHandle, UCHAR *ImageBuf, ULONG *Size)
C#[改前]:public static extern int GetOriginalImage(IntPtr hChannelHandle, byte[] ImageBuf, ulong Size);
C#[改后]:public static extern int GetOriginalImage(IntPtr hChannelHandle, byte[] ImageBuf, out int Size);
小节:一般结构体对应翻译的话都要加ref;一般数值类型的加*对应都要加out。
2. 2009-3-19
2.1 GetBoardDetail
VC++原型:int __stdcall GetBoardDetail(UINT boardNum,DS_BOARD_DETAIL *pBoardDetail)
C# 改前:public static extern int GetBoardDetail(uint boardNum, DS_BOARD_DETAIL pBoardDetail);
C# 改后:public static extern int GetBoardDetail(uint boardNum, ref DS_BOARD_DETAIL pBoardDetail);
2.2 GetDspDetail
VC++原型:int __stdcall GetDspDetail(UINT dspNum,DSP_DETAIL *pDspDetail)
C# 改前:public static extern int GetDspDetail(uint dspNum, DSP_DETAIL pDspDetail);
C# 改后:public static extern int GetDspDetail(uint dspNum, ref DSP_DETAIL pDspDetail);
结束
在后续的文章中本文中API仍然可能会变动,毕竟我们用的只是其中的一部分,我会随时更新,感谢继续关注。本来是作为一篇文章发布的,发现代码过长,插入都费老半天,所有拆开成上下了!!
#region 3.6移动侦测
// 释 义: 移动侦测
//DS4000HC提供运动强度信息来处理运动检测,设置移动侦测区域时以32*32像素块为
//单位,按4CIF(704*576)分辨率计算,每行有22个块(704/32),PAL时18行(576/32),
//NTSC时15行(480/32),与编码格式无关。经过测试,这种方法比H卡提高了灵敏度和可
//靠性,并简化了返回的数据,返回的值是18个DWORD,对应屏幕高度576/32=18行(PAL),
//每个DWORD的0-21位对应屏幕宽度704/32=22, 其中1为运动,0为静止,也可以调用原有
//MotionAnalyzer分析结果
//4.0版本的SDK新增了接口函数SetupMotionDetectionEx,提供了更灵活的功能,并且
//简化了用户的工作量。
#region 3.6.1设置方式一
// 设置移动侦测相关参数并启动移动侦测后,运动检测信息会通过数据流传送,用户程序
//发现PktMotionDetection帧类型时,可调用MotionAnalyzer来处理运动信息,结果由
//MotionAnalyzer在iResult中返回。也可以按照SDK提供的数据格式来自己分析,运动信息格
//式参见移动侦测释义。
/// <summary>
/// 3.6.1.1设置移动侦测灵敏度
/// 说 明: 调整运动分析的灵敏度,支持动态调整,此函数决定DSP全局运动分析的灵敏度。
/// 而MotionAnalyzer的iThreshold则主要用于分析指定区域的运动统计结果。
///
/// int __stdcall AdjustMotionDetectPrecision(HANDLE hChannelHandle, int iGrade, int iFastMotionDetectFps, int iSlowMotionDetectFps)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="iGrade">
/// 运动分析灵敏度等级,取值范围0-6,0级最灵敏,6级最迟钝,推荐值为2。
/// 将iGrade和“0x80000000“做”或“操作,会对移动侦测启用自适应分析。
/// </param>
/// <param name="iFastMotionDetectFps">高速运动检测的帧间隔,取值范围0-12,0表示不作高速运动检测,通常值取为2</param>
/// <param name="iSlowMotionDetectFps">低速运动检测的帧间隔,取值范围13以上,当取值为0时,不作低速运动检测</param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int AdjustMotionDetectPrecision(IntPtr hChannelHandle, int iGrade, int iFastMotionDetectFps, int iSlowMotionDetectFps);
/// <summary>
/// 3.6.1.2设置移动侦测区域范围及个数
/// 说 明: 设置运动检测区域;当收到运动信息的数据帧(PktMotionDetection)时,调用
/// MotionAnalyzer;MotionAnalyzer会根据在SetupMotionDetection中的设置来分析每个需要
/// 检测的区域,当某区域的阀值(MotionAnalyzer的iThreshold)到达时,会在返回的区域数组
/// (MotionAnalyzer的iResult)标明最后的判断;矩形框范围是(0,0,703,575)
///
/// int __stdcall SetupMotionDetection(HANDLE hChannelHandle, RECT *RectList, int iAreas)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="RectList">矩形框数组</param>
/// <param name="iAreas">矩形框个数,最大值为100</param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetupMotionDetection(IntPtr hChannelHandle, ref Rectangle RectList, int iAreas);
/// <summary>
/// 3.6.1.3移动侦测分析
/// 说 明: 动态监测分析,移动侦测由DSP完成,DSP送出的IPktMotionData帧就是已经
/// 分析好的运动信息,区域的运动分析由主机完成,数据源由码流中的PktMotionData帧提供,
/// 结果在iResult中说明,2.0以上版本的运动分析基于DSP提供的运动强度,不再使用运动
/// 矢量,其灵敏度及可靠性有大幅提高,用户软件可使用由码流提供的运动强度信息来自己分
/// 析或调用该函数来进行区域分析
///
/// 函 数: int __stdcall MotionAnalyzer(HANDLE hChannelHandle, char *MotionData, int iThreshold, int *iResult)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="MotionData">运动矢量指针</param>
/// <param name="iThreshold">判断运动程度的伐值</param>
/// <param name="iResult">按照伐值指定的强度分析后的结果数组。数组的大小在SetupMotionDetection的numberOfAreas指定,如果某数组单元的值大于零则表明有该区域有该值表明的运动强度</param>
/// <returns>成功返回0;失败返回错误号 </returns>
[DllImport("DS40xxSDK.dll")]
public static extern int MotionAnalyzer(IntPtr hChannelHandle, char[] MotionData, int iThreshold, ref int iResult);
#endregion
#region 3.6.2设置方式二
/// <summary>
/// 3.6.2.1设置移动侦测(扩展)
/// 说 明: 设置移动侦测,这种设置方式可替代设置方式一中3个函数的共同作用,在这种情况下,DSP将不再反馈移动侦测帧。
/// 参数delay:画面静止之后的延时时间,单位为秒,若在该延时时间内没有产生
/// 移动侦测,则将回调函数MotionDetectionCallback之中的参数bMotionDetected标志为False,
/// 若在该延时时间之内,在当前所设置的区域内产生移动侦测,则bMotionDetected被标志为
/// True,并且在产生移动侦测之后的delay时间内,DSP不会对在此时间段之内的视频帧进行
/// 移动侦测分析,因此DSP和主机都省却了在此时间段对产生的视频运动进行频繁判断和分
/// 析。直至超过了此delay秒延时时间,DSP才会对此时刻的视频进行判断,若产生了移动侦
/// 测,则回调函数中的bMotionDetected被再次标志为True,否则标志为False。
///
///
/// 函 数: int __stdcall SetupMotionDetectionEx(HANDLE hChannelHandle,int iGrade, int iFastMotionDetectFps, int iSlowMotionDetectFps,UINT delay,RECT *RectList, int iAreas, MOTION_DETECTION_CALLBACK MotionDetectionCallback,int reserved)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="iGrade">
/// 运动分析灵敏度等级,取值范围0-6,0级最灵敏,6级最迟钝,
/// 推荐值2。将iGrade和“0x80000000“做”或“操作,会对移动侦测启用
/// 自适应分析。
/// </param>
/// <param name="iFastMotionDetectFps">高速运动检测的帧间隔,取值范围0-12,0表示不作高速运动检测,通常值取为2</param>
/// <param name="iSlowMotionDetectFps">低速运动检测的帧间隔,取值范围13以上,当取值为0时,不作低速运动检测</param>
/// <param name="delay">前一次移动帧测产生后的延时时间</param>
/// <param name="RectList">进行移动侦测的矩形框数组</param>
/// <param name="iAreas">矩形框个数(最大个数为100)</param>
/// <param name="MotionDetectionCallback">移动侦测结果回调函数 </param>
/// <param name="reserved">保留参数</param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetupMotionDetectionEx(IntPtr hChannelHandle, int iGrade, int iFastMotionDetectFps, int iSlowMotionDetectFps, uint delay, ref Rectangle RectList, int iAreas, MOTION_DETECTION_CALLBACK MotionDetectionCallback, int reserved);
#endregion
#region 3.6.3启动及停止移动侦测
/// <summary>
/// 3.6.3.1启动移动侦测
/// 说 明: 启动移动侦测。
/// 注意:移动侦测和编码相互独立,用户程序可在不启动编码的情况下进行运动检测
///
/// int __stdcall StartMotionDetection(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <returns>成功返回0;失败返回错误号</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int StartMotionDetection(IntPtr hChannelHandle);
/// <summary>
/// 3.6.3.2停止移动侦测
/// 说 明: 停止移动侦测
///
/// int __stdcall StopMotionDetection(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle"></param>
/// <returns></returns>
[DllImport("DS40xxSDK.dll")]
public static extern int StopMotionDetection(IntPtr hChannelHandle);
#endregion
#endregion