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,如需转载请自行联系原作者

相关文章
|
4月前
|
缓存 测试技术 API
API的封装步骤流程
API封装流程是一个系统化的过程,旨在将内部功能转化为可复用的接口供外部调用。流程包括明确需求、设计接口、选择技术和工具、编写代码、测试、文档编写及部署维护。具体步骤为确定业务功能、数据来源;设计URL、请求方式、参数及响应格式;选择开发语言、框架和数据库技术;实现数据连接、业务逻辑、错误处理;进行功能、性能测试;编写详细文档;部署并持续维护。通过这些步骤,确保API稳定可靠,提高性能。
|
5月前
|
开发框架 缓存 .NET
并发请求太多,服务器崩溃了?试试使用 ASP.NET Core Web API 操作筛选器对请求进行限流
并发请求太多,服务器崩溃了?试试使用 ASP.NET Core Web API 操作筛选器对请求进行限流
239 0
|
2月前
|
负载均衡 数据可视化 API
像素流送api ue多人访问需要什么显卡服务器
本文总结了关于像素流送技术的五大常见问题,包括是否支持Unity模型推流、UE多人访问的最大并发数、所需服务器配置、稳定性问题及API支持情况,旨在帮助开发者更好地理解和应用这一技术。
59 1
|
4月前
|
API PHP
ThinkPHP 通用的API格式封装
本文介绍了在ThinkPHP框架中如何统一封装API返回格式的方法,包括创建状态码枚举类、编写统一格式化函数以及在BaseController和Error控制器中重写`__call`方法来处理不存在的方法或控制器调用,以实现统一的错误处理和返回格式。
ThinkPHP 通用的API格式封装
|
3月前
|
JSON JavaScript API
(API接口系列)商品详情数据封装接口json数据格式分析
在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦!
|
3月前
|
JSON JavaScript 前端开发
使用 Node.js 和 Express 构建 RESTful API 服务器
【10月更文挑战第3天】使用 Node.js 和 Express 构建 RESTful API 服务器
|
3月前
|
JSON JavaScript 前端开发
使用JavaScript和Node.js构建简单的RESTful API服务器
【10月更文挑战第12天】使用JavaScript和Node.js构建简单的RESTful API服务器
31 0
|
5月前
|
缓存 测试技术 API
从零到一:构建高效的 RESTful API 服务器
在当今的软件开发环境中,RESTful API 是实现系统间数据交互的关键组件。本文探讨了如何从头开始构建一个高效的 RESTful API 服务器,包括技术选型、架构设计、性能优化等方面的内容。我们将以 Python 的 Flask 框架为例,展示如何设计一个可扩展且高性能的 API 服务器,并提供实际代码示例来说明最佳实践。
|
5月前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
224 0
|
6月前
|
开发框架 缓存 NoSQL
基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用
基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用