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

简介:
  ///   <summary>
    
///  解码回调函数
    
///  
    
///  typedef void (*DECODER_VIDEO_CAPTURE_CALLBACK)(UINT nChannelNumber, void *DataBuf,UINT width,UINT height,UINT nFrameNum,UINT nFrameTime, SYSTEMTIME *pFrameAbsoluteTime,void *context) 
    
///   </summary>
    
///   <param name="nChannelNumber"> 解码通道句柄 </param>
    
///   <param name="DataBuf"> 缓冲区地址 </param>
    
///   <param name="width"> 图像宽度 </param>
    
///   <param name="height"> 图像高度 </param>
    
///   <param name="nFrameNum"> 捕获的当前帧的序号 </param>
    
///   <param name="nFrameTime"> 捕获的当前帧的相对时间,单位:毫秒 </param>
    
///   <param name="pFrameAbsoluteTime"> 捕获的当前帧的绝对时间 </param>
    
///   <param name="context"> 设备上下文 </param>
     public   delegate   void  DECODER_VIDEO_CAPTURE_CALLBACK( uint  nChannelNumber, IntPtr DataBuf,  uint  width,  uint  height,  uint  nFrameNum,  uint  nFrameTime, SYSTEMTIME pFrameAbsoluteTime, IntPtr context);

    
///   <summary>
    
///  创建索引完成回调函数
    
///  
    
///  typedef void (*FILE_REF_DONE_CALLBACK)(UINT nChannel,UINT nSize)
    
///   </summary>
    
///   <param name="nChannel"> 通道号 </param>
    
///   <param name="nSize"> 索引大小(暂时无效,以后可以增加索引导出、导入功能)  </param>
     public   delegate   void  FILE_REF_DONE_CALLBACK( uint  nChannel,  uint  nSize);

    
#endregion



    
///   <summary>
    
///  DS40xxSDK.dll
    
///   </summary>
     public   class  HikVisionSDK
    {
        
///   <summary>
        
///  状态
        
///   </summary>
         public   static   readonly  List < string >  state  =   new  List < string > ( new   string []{
            
"" " 正在打开 " " 音频信号丢失 " " 视频信号丢失 " " 有物体移动 " // 0-4 
             " 自动分割录像 " " 开始录像 " " 停止录像 " " 启动声音监听 " " 停止声音监听 " // 5-9 
             " 启动视频预览 " " 停止视频预览 " " 启动录像 " " 停止录像 " " 启动视频报警 " // 10-14 
             " 关闭视频报警 " " 启动音频报警 " " 停止音频报警 " " 启动移动侦测 " " 停止移动侦测 " // 15-19 
             " 启动视频遮挡 " " 关闭视频遮挡 " " 开始屏幕输出 " " 停止屏幕输出 " " 启动视频LOGO " // 20-24 
             " 停止视频LOGO " " 开始视频OSD " " 停止视频OSD " " 切换为黑白视频 " " 切换为彩色视频 " // 25-29 
             " 切换为黑屏显示 " " 切换为白屏显示 " " 视频色彩复位 " " 启动全屏显示 " " 采集卡已经加载 " // 30-34 
             " 采集卡已经卸截 " " 视频服务启动成功 " " 视频服务已停止 " " 静音 " " 音量恢复 " // 35-39 
             " 云台控制命令发送 " " 系统出现未知错误 " " 录像文件大小 " " 配置端口号成功 " " 连接服务端成功 " // 40-44 
             " 正在连接 " " 开始接收图象 " " 异常退出 " " 接收完毕,退出 " " 无法联系服务端 " // 45-49 
             " 服务端拒绝访问 " " 无效 " " 停止客户端连接 " " 图像抓取成功 " " 初始化服务端网络连接成功 " // 50-54 
             " 视频服务启动失败 " " 退出全屏预览 " "" "" ""   // 55-59 
        });

        
// 可以用新版函数替代功能或者无效的API 
        
// GetTotalChannels:可用GetEncodeChannelCount替代 
        
// GetTotalDSPs:可用GetDspCount 替代 
        
// SetupDateTime:4.0版本起无效 
        
// HW_GetChannelNum:无效,请使用GetBoardDetail 
        
// HW_GetDeviceSerialNo:无效,请使用GetBoardDetail 
        
// HW_SetVideoOutStandard:无效,请使用SetDisplayStandard或SetDefaultVideoStandard 
        
// HW_SetDspDeadlockMsg:无效 
        
// HW_ResetDsp:无效 
        
// HW_SetDisplayPara:DISPLAY_PARA结构中bToVideoOut无效,MD卡模拟视频输出功能
        
// 已经整合到视频矩阵之中。 

        
#region  流类型宏定义

        
///   <summary>
        
///  视频流 
        
///  #define STREAM_TYPE_VIDEO 
        
///   </summary>
         private   const   int  STREAM_TYPE_VIDEO  =   1 ;
        
///   <summary>
        
///  音频流 
        
///  #define STREAM_TYPE_AUDIO   
        
///   </summary>
         private   const   int  STREAM_TYPE_AUDIO  =   2 ;
        
///   <summary>
        
///  音视频复合流 
        
///  #define STREAM_TYPE_AVSYNC 
        
///   </summary>
         private   const   int  STREAM_TYPE_AVSYNC  =   3 ;

        
#endregion

        
#region  1.板卡初始化及卸载

        
///   <summary>
        
///  1.1初始化DSP InitDSPs
        
///      说  明: 初始化系统中每一块板卡,应在应用软件程序启动时完成。如果返回值为0则表
        
///      明初始化失败,可能没有找到相应的DSP软件模块。
        
///  
        
///  int __stdcall InitDSPs()
        
///   </summary>
        
///   <returns> 系统内可用的编码通道个数。  </returns>
        [DllImport( " DS40xxSDK.dll " )]
        
public   static   extern   int  InitDSPs();


        
///   <summary>
        
///  1.2卸载DSP DeInitDSPs
        
///      说  明:  关闭每一块板卡上的功能,应在应用软件程序退出时调用。 
        
///  
        
///  int __stdcall DeInitDSPs()
        
///   </summary>
        
///   <returns> 0 </returns>
        [DllImport( " DS40xxSDK.dll " )]
        
public   static   extern   int  DeInitDSPs();

        
#endregion

        
#region  2.板卡信息获取

        
///   <summary>
        
///  2.1获取系统中板卡的张数GetBoardCount 
        
///      说  明:  获取系统中所有板卡的张数,包含编码卡和解码卡。
        
///  
        
///  unsigned int __stdcall GetBoardCount() 
        
///   </summary>
        
///   <returns> 系统中板卡的总张数。 </returns>
        [DllImport( " DS40xxSDK.dll " )]
        
public   static   extern   uint  GetBoardCount();

        
///   <summary>
        
///  2.2获取系统中DSP的个数GetDspCount 
        
///      说  明:  获取系统中所有板卡的DSP的个数。 
        
///      
        
///  unsigned int __stdcall GetDspCount()
        
///   </summary>
        
///   <returns> 系统中DSP的总个数 </returns>
        [DllImport( " DS40xxSDK.dll " )]
        
public   static   extern   uint  GetDspCount();

        
///   <summary>
        
///  GetTotalDSPs:可用GetDspCount 替代
        
///  获得实际可用DSP
        
///   </summary>
        
///   <returns></returns>
        [DllImport( " DS40xxSDK.dll " )]
        
public   static   extern   int  GetTotalDSPs();

        
///   <summary>
        
///  2.3获取系统中编码通道的个数GetEncodeChannelCount
        
///      说  明:  获取系统中所有编码卡的编码通道总个数,包含H系列和HC系列编码卡。
        
///  
        
///  unsigned int __stdcall GetEncodeChannelCount()
        
///   </summary>
        
///   <returns> 系统中编码通道的个数 </returns>
        [DllImport( " DS40xxSDK.dll " )]
        
public   static   extern   uint  GetEncodeChannelCount();

        
///   <summary>
        
///  2.4获取系统中解码通道的个数GetDecodeChannelCount 
        
///      说  明:  获取系统中MD卡的解码通道个数 
        
///  
        
///  unsigned int __stdcall GetDecodeChannelCount() 
        
///   </summary>
        
///   <returns></returns>
        [DllImport( " DS40xxSDK.dll " )]
        
public   static   extern   uint  GetDecodeChannelCount();

        
///   <summary>
        
///  2.5获取系统中解码显示通道的个数GetDisplayChannelCount
        
///      说  明:  获取系统中MD卡显示通道的个数,即模拟视频输出通道的个数
        
///  
        
///  unsigned int __stdcall GetDisplayChannelCount()
        
///   </summary>
        
///   <returns> 系统中显示通道的个数 </returns>
        [DllImport( " DS40xxSDK.dll " )]
        
public   static   extern   uint  GetDisplayChannelCount();

        
///   <summary>
        
///  2.6获取板卡详细信息GetBoardDetail 
        
///      说  明:  获取某张板卡的详细信息 
        
///  
        
///  int __stdcall GetBoardDetail(UINT boardNum,DS_BOARD_DETAIL *pBoardDetail)
        
///   </summary>
        
///   <param name="boardNum"> 板卡索引 </param>
        
///   <param name="pBoardDetail"> 板卡信息 </param>
        
///   <returns> 成功返回0;失败返回错误号 </returns>
        [DllImport( " DS40xxSDK.dll " )]
        
public   static   extern   int  GetBoardDetail( uint  boardNum,  ref  DS_BOARD_DETAIL pBoardDetail);

        
///   <summary>
        
///  2.7获取DSP详细信息GetDspDetail
        
///      说  明:  获取某个DSP的详细信息 
        
///  
        
///  int __stdcall GetDspDetail(UINT dspNum,DSP_DETAIL *pDspDetail)
        
///   </summary>
        
///   <param name="dspNum"> DSP索引 </param>
        
///   <param name="pDspDetail"> DSP信息 </param>
        
///   <returns> 成功返回0;失败返回错误号 </returns>
        [DllImport( " DS40xxSDK.dll " )]
        
public   static   extern   int  GetDspDetail( uint  dspNum,  ref  DSP_DETAIL pDspDetail);

        
///   <summary>
        
///  2.8获取板卡型号及序列号信息GetBoardInfo
        
///      说  明:  获取板卡的型号及序列号信息
        
///  
        
///  int __stdcall GetBoardInfo(HANDLE hChannelHandle, ULONG *BoardType,  UCHAR *SerialNo)
        
///   </summary>
        
///   <param name="hChannelHandle"> 通道句柄 </param>
        
///   <param name="BoardType"> 板卡型号 </param>
        
///   <param name="SerialNo">
        
///  板卡ID号, 内容为板卡序列号的ASCII的数值,次序为SerialNo[0] 对应最高位,
        
///  SerialNo[11]对应最低位。比如卡号为“40000002345”的值对应为 4,0,0,0,0,1,0,0,2,3,4,5 的整形数组。
        
///   </param>
        
///   <returns> 成功为0;失败返回错误号  </returns>
        [DllImport( " DS40xxSDK.dll " )]
        
public   static   extern   int  GetBoardInfo(IntPtr hChannelHandle,  ulong  BoardType,  byte [] SerialNo);


        
///   <summary>
        
///  2.9获取板卡特殊功能信息GetCapability
        
///      说  明:  获取板卡特殊功能信息
        
///  
        
///  int __stdcall GetCapability(HANDLE hChannelHandle,  CHANNEL_CAPABILITY *Capability) 
        
///   </summary>
        
///   <param name="hChannelHandle"> 通道句柄 </param>
        
///   <param name="Capability"> 特殊功能  </param>
        
///   <returns> 成功返回0;失败返回错误号 </returns>
        [DllImport( " DS40xxSDK.dll " )]
        
public   static   extern   int  GetCapability(IntPtr hChannelHandle, CHANNEL_CAPABILITY Capability);


        
///   <summary>
        
///  2.10获取板卡SDK信息GetSDKVersion
        
///      说  明:  获取当前所使用的DSP、Driver、SDK版本号
        
///  
        
///  int __stdcall GetSDKVersion(PVERSION_INFO VersionInfo) 
        
///   </summary>
        
///   <param name="VersionInfo"> 版本信息 </param>
        
///   <returns> 成功返回0;失败返回错误号。 </returns>
        [DllImport( " DS40xxSDK.dll " )]
        
public   static   extern   int  GetSDKVersion( ref  PVERSION_INFO VersionInfo);

        
///   <summary>
        
///  2.11获取板卡SDK及DSP错误报告GetLastErrorNum*,此函数只对H卡有效
        
///      说  明:  获取SDK及DSP错误报告。此函数只对H卡有效,用于HC卡上返回0且无效
        
///  
        
///  int __stdcall GetLastErrorNum(HANDLE hChannelHandle, ULONG *DspError,  ULONG *SdkError) 
        
///   </summary>
        
///   <param name="hChannelHandle"> 通道句柄 </param>
        
///   <param name="DspError"> DSP错误 </param>
        
///   <param name="SdkError"> SDK错误 </param>
        
///   <returns> DSP错误信息、SDK错误信息 </returns>
        [DllImport( " DS40xxSDK.dll " )]
        
public   static   extern   int  GetLastErrorNum(IntPtr hChannelHandle,  ref   int  DspError,  ref   int  SdkError);

        
#endregion

        
#region  3.编码卡API

        
#region  3.1通道打开及关闭

        
///   <summary>
        
///  3.1.1打开通道ChannelOpen
        
///      说  明:  打开通道,获取编码通道的操作句柄,与通道相关的操作需使用相对应的句柄。 
        
///  
        
///  HANDLE __stdcall ChannelOpen(int ChannelNum) 
        
///   </summary>
        
///   <param name="ChannelNum"> 通道号(从0开始) </param>
        
///   <returns> 成功返回有效句柄(值可能为0);失败返回0xFFFFFFFF。 </returns>
        [DllImport( " DS40xxSDK.dll " )]
        
public   static   extern  IntPtr ChannelOpen( int  ChannelNum);

        
///   <summary>
        
///  3.1.2关闭通道ChannelClose
        
///      说  明:  关闭通道,释放相关资源 
        
///  
        
///  int __stdcall ChannelClose(HANDLE hChannelHandle) 
        
///   </summary>
        
///   <param name="hChannelHandle"> 通道句柄 </param>
        
///   <returns> 成功返回0;失败返回错误号 </returns>
        [DllImport( " DS40xxSDK.dll " )]
        
public   static   extern   int  ChannelClose(IntPtr hChannelHandle);

        
#endregion

        
#region  3.2视频预览

        
#region  3.2.1 Overlay预览模式
        
//         释  义:  overlay预览模式 
        
// Overlay通常被称为重叠页面或者是覆盖层,是一种需要特定的硬件支持的页面,通常
        
// 被用于显示实时视频于主页面之上,而不需要Blit操作到主页面或用任何方法改变主页面的

        //内容。使用该方式进行预览可以提高预览的画质和降低CPU利用率。


本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/586677,如需转载请自行联系原作者

相关文章
|
17天前
|
缓存 前端开发 API
API接口封装系列
API(Application Programming Interface)接口封装是将系统内部的功能封装成可复用的程序接口并向外部提供,以便其他系统调用和使用这些功能,通过这种方式实现系统之间的通信和协作。下面将介绍API接口封装的一些关键步骤和注意事项。
|
3月前
|
JavaScript API
【vue实战项目】通用管理系统:api封装、404页
【vue实战项目】通用管理系统:api封装、404页
37 3
|
1月前
|
安全 数据处理 C#
C# Post数据或文件到指定的服务器进行接收
C# Post数据或文件到指定的服务器进行接收
|
1月前
|
前端开发 API 数据处理
uni-app 封装api请求
uni-app 封装api请求
15 0
|
2月前
|
缓存 监控 测试技术
ERP系统对接方案与API接口封装系列(高并发)
企业资源规划(ERP)系统是现代企业管理的核心,它集成了企业内部的各个部门和业务流程。为了实现ERP系统与其他外部系统或应用程序之间的数据交换和协作,需要对接方案。API(应用程序编程接口)是实现系统对接的常用方法之一。
|
3月前
|
前端开发 JavaScript 小程序
【uniapp】十分钟带你封装uniapp的api请求
【uniapp】十分钟带你封装uniapp的api请求
128 0
|
4月前
|
API 开发工具 开发者
通过解析封装关键词搜索速卖通商品列表数据接口,速卖通API接口
通过解析封装关键词搜索速卖通商品列表数据接口,速卖通API接口
33 0
|
4月前
|
XML JSON 安全
uni-app API请求封装:让接口调用更加简单高效
在进行uni-app开发时,网络请求是必不可少的环节。为了方便开发,我们可以封装一些网络请求方法,以便在多个页面中复用,并且可以统一处理错误信息等问题,提高开发效率和代码质量。本文将介绍如何封装网络请求方法。
357 0
uni-app API请求封装:让接口调用更加简单高效
|
5月前
|
小程序 前端开发 API
小程序api封装 promise使用
小程序api封装 promise使用
32 0
|
6月前
|
JavaScript API
让 Spartacus 服务器端渲染引入 long API 调用超时机制的两种配置方法
让 Spartacus 服务器端渲染引入 long API 调用超时机制的两种配置方法
49 0

热门文章

最新文章