您的位置:首页 > 编程语言 > C#

C# 视频监控系列(7):服务器端——封装API(下) (6)

2009-03-10 10:39 176 查看
#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,修改前本文备份:/Files/over140/2009/3/2009-3-16.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仍然可能会变动,毕竟我们用的只是其中的一部分,我会随时更新,感谢继续关注。本来是作为一篇文章发布的,发现代码过长,插入都费老半天,所有拆开成上下了!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐