C# 视频监控系列(11):H264播放器——封装API[HikPlayM4.dll] (1)

简介:

正文

     HikPlayM4.dll

 

using  System;
using  System.Runtime.InteropServices;
using  System.Drawing;

namespace  HikPlayer
{

    
#region  struct

    
public   struct  FRAME_INFO
    {
        
///   <summary>
        
///  画面宽,单位像素。如果是音频数据则为0
        
///  
        
///  long nWidth;
        
///   </summary>
         public   int  nWidth;
        
///   <summary>
        
///  画面高。如果是音频数据则为0
        
///  
        
///  long nHeight;
        
///   </summary>
         public   int  nHeight;
        
///   <summary>
        
///  时标信息,单位毫秒。
        
///  
        
///  long nStamp;
        
///   </summary>
         public   int  nStamp;
        
///   <summary>
        
///  数据类型,T_AUDIO16,T_RGB32, T_YV12
        
///  
        
///  long nType;
        
///   </summary>
         public   int  nType;
        
///   <summary>
        
///  编码时产生的图像帧率。
        
///  
        
///  long nFrameRate;
        
///   </summary>
         public   int  nFrameRate;
    }

    
///   <summary>
    
///  typedef struct{ 
    
///      long nFilePos;   //文件位置; 
    
///      long nFrameNum;  //帧序号; 
    
///      long nFrameTime;  //帧时标(ms); 
    
///  }FRAME_POS,*PFRAME_POS;  
    
///   </summary>
     public   struct  PFRAME_POS
    {
        
///   <summary>
        
///  出错的文件位置 
        
///  
        
///  long nFilePos;
        
///   </summary>
         public   int  nFilePos;
        
///   <summary>
        
///  出错后正常的帧号 
        
///  
        
///  long nFrameNum;
        
///   </summary>
         public   int  nFrameNum;
        
///   <summary>
        
///  出错后正常的时间(相对此文件开始时间) 
        
///  
        
///  long nFrameTime;
        
///   </summary>
         public   int  nFrameTime;
        
///   <summary>
        
///  出错时的帧号 
        
///  
        
///  long nErrorFrameNum;
        
///   </summary>
         public   int  nErrorFrameNum;
        
///   <summary>
        
///  出错的绝对时间(设备录象文件有用) 
        
///  
        
///  SYSTEMTIME *pErrorTime;
        
///   </summary>
         public  DateTime pErrorTime;
        
///   <summary>
        
///  出错时丢失的帧数 
        
///  
        
///  long nErrorLostFrameNum;
        
///   </summary>
         public   int  nErrorLostFrameNum;
        
///   <summary>
        
///   出错时错误的数据大小 
        
///  
        
///  long nErrorFrameSize;
        
///   </summary>
         public   int  nErrorFrameSize;
    }

    
public   struct  FRAME_TYPE
    {
        
///   <summary>
        
///  数据帧首地址
        
///  
        
///  char *pDataBuf; 
        
///   </summary>
         public   byte [] pDataBuf;
        
///   <summary>
        
///  数据帧的大小 
        
///  long nSize; 
        
///   </summary>
         public   int  nSize;
        
///   <summary>
        
///  数据帧的个数
        
///  
        
///  long nFrameNum;  
        
///   </summary>
         public   int  nFrameNum;
        
///   <summary>
        
///  是否音频帧
        
///  
        
///  BOOL bIsAudio;   
        
///   </summary>
         public   bool  bIsAudio;
        
///   <summary>
        
///  保留
        
///  
        
///  long nReserved; 
        
///   </summary>
         public   int  nReserved;
    }

    
#endregion

    
#region  delegate

    
///   <summary>
    
///  void (CALLBACK* DecCBFun)(long nPort,char * pBuf,long nSize,FRAME_INFO * pFrameInfo, long nReserved1,long nReserved2)
    
///  
    
///  注意:关于回调函数。因为vb不支持多线程,所以当回调函数是VB声明的函数时,在vc的线程中调用
    
///  vb的函数,会有问题。详见:Microsoft Knowledge Base Article - Q198607 “PRB: Access Violation in VB 
    
///  Run-Time Using AddressOf ”。 
    
///   </summary>
    
///   <param name="nPort"> 播放器通道号 </param>
    
///   <param name="pBuf"> 解码后的音视频数据 </param>
    
///   <param name="nSize"> 解码后的音视频数据pBuf的长度 </param>
    
///   <param name="pFrameInfo"> 图像和声音信息 </param>
    
///   <param name="nReserved1"> 保留参数 </param>
    
///   <param name="nReserved2"> 保留参数 </param>
     public   delegate   void  DecCBFun( int  nPort, IntPtr pBuf,  int  nSize,  ref  FRAME_INFO pFrameInfo,  int  nReserved1,  int  nReserved2);

    
///   <summary>
    
///  void (CALLBACK* DisplayCBFun)(long nPort,char * pBuf,long nSize,long nWidth,long nHeight,long nStamp,long nType,long nReceaved)); 
    
///   </summary>
    
///   <param name="nPort"> 通道号 </param>
    
///   <param name="pBuf"> 返回图像数据 </param>
    
///   <param name="nSize"> 返回图像数据大小 </param>
    
///   <param name="nWidth"> 画面宽,单位像素 </param>
    
///   <param name="nHeight"> 画面高 </param>
    
///   <param name="nStamp"> 时标信息,单位毫秒 </param>
    
///   <param name="nType"> 数据类型, T_YV12,T_RGB32,T_UYVY </param>
    
///   <param name="nReceaved"> 保留 </param>
     public   delegate   void  DisplayCBFun( int  nPort, IntPtr pBuf,  int  nSize,  int  nWidth,  int  nHeight,  int  nStamp,  int  nType,  int  nReceaved);

    
///   <summary>
    
///  void CALLBACK SourceBufCallBack(long nPort,DWORD nBufSize, DWORD dwUser,void*pContext) 
    
///   </summary>
    
///   <param name="nPort"> 播放器通道号 </param>
    
///   <param name="nBufSize"> 缓冲区中剩余数据 </param>
    
///   <param name="dwUser"> 用户数据 </param>
    
///   <param name="pContext"> 保留数据 </param>
     public   delegate   void  SourceBufCallBack( int  nPort,  ushort  nBufSize,  ushort  dwUser, IntPtr pContext);

    
///   <summary>
    
///  void FileRefDone(DWORD nPort,DWORD nUser) 
    
///   </summary>
    
///   <param name="nPort"> 播放器通道号 </param>
    
///   <param name="nUser"> 用户数据 </param>
     public   delegate   void  FileRefDone( int  nPort,  ushort  nUser);

    
///   <summary>
    
///  void CALLBACK DrawFun(long nPort,HDC hDc,LONG nUser); 
    
///   </summary>
    
///   <param name="nPort"> 通道号 </param>
    
///   <param name="hDc"> hDc OffScreen表面设备上下文,你可以像操作显示窗口客户区DC那样操作它。 </param>
    
///   <param name="nUser"> 用户数据,就是上面输入的用户数据 </param>
     public   delegate   void  DrawFun( int  nPort, IntPtr hDc,  int  nUser);

    
///   <summary>
    
///  void __stdcall Verify(long nPort, FRAME_POS * pFilePos, DWORD bIsVideo, DWORD nUser)
    
///   </summary>
    
///   <param name="nPort"> 通道号 </param>
    
///   <param name="pFilePos"> 文件位置 </param>
    
///   <param name="bIsVideo"> 是否视频数据,1视频,0音频 </param>
    
///   <param name="nUser"> 用户数据 </param>
     public   delegate   void  Verify( int  nPort,  ref  PFRAME_POS pFilePos,  ushort  bIsVideo,  ushort  nUser);


本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/586635,如需转载请自行联系原作者
相关文章
|
1月前
|
开发框架 .NET API
RESTful API 设计与实现:C# 开发者的一分钟入门
【10月更文挑战第5天】本文从零开始,介绍了如何使用 C# 和 ASP.NET Core 设计并实现一个简单的 RESTful API。首先解释了 RESTful API 的概念及其核心原则,然后详细说明了设计 RESTful API 的关键步骤,包括资源识别、URI 设计、HTTP 方法选择、状态码使用和错误处理。最后,通过一个用户管理 API 的示例,演示了如何创建项目、定义模型、实现控制器及运行测试,帮助读者掌握 RESTful API 的开发技巧。
57 7
|
2月前
|
缓存 测试技术 API
API的封装步骤流程
API封装流程是一个系统化的过程,旨在将内部功能转化为可复用的接口供外部调用。流程包括明确需求、设计接口、选择技术和工具、编写代码、测试、文档编写及部署维护。具体步骤为确定业务功能、数据来源;设计URL、请求方式、参数及响应格式;选择开发语言、框架和数据库技术;实现数据连接、业务逻辑、错误处理;进行功能、性能测试;编写详细文档;部署并持续维护。通过这些步骤,确保API稳定可靠,提高性能。
|
2月前
|
API PHP
ThinkPHP 通用的API格式封装
本文介绍了在ThinkPHP框架中如何统一封装API返回格式的方法,包括创建状态码枚举类、编写统一格式化函数以及在BaseController和Error控制器中重写`__call`方法来处理不存在的方法或控制器调用,以实现统一的错误处理和返回格式。
ThinkPHP 通用的API格式封装
|
1月前
|
JSON JavaScript API
(API接口系列)商品详情数据封装接口json数据格式分析
在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦!
|
2月前
|
编解码 C# 数据库
C# + WPF 音频播放器 界面优雅,体验良好
【9月更文挑战第18天】这是一个用 C# 和 WPF 实现的音频播放器示例,界面简洁美观,功能丰富。设计包括播放/暂停按钮、进度条、音量控制滑块、歌曲列表和专辑封面显示。功能实现涵盖音频播放、进度条控制、音量调节及歌曲列表管理。通过响应式设计、动画效果、快捷键支持和错误处理,提升用户体验。可根据需求扩展更多功能。
118 3
|
2月前
|
安全 C#
C# 面向对象编程的三大支柱:封装、继承与多态
【9月更文挑战第17天】在C#中,面向对象编程的三大支柱——封装、继承与多态,对于编写安全、可维护、可复用的代码至关重要。封装通过访问修饰符和属性保护数据;继承允许子类继承父类的属性和方法,实现代码复用和多态;多态则提高了代码的灵活性和通用性。掌握这三大概念能显著提升C#编程能力,优化开发效率和代码质量。
|
1月前
|
API C#
异步轮询 Web API 的实现与 C# 示例
异步轮询 Web API 的实现与 C# 示例
78 0
|
4月前
|
开发框架 缓存 NoSQL
基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用
基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用
|
3月前
|
开发框架 人工智能 自然语言处理
基于ChatGPT的API的C#接入研究
基于ChatGPT的API的C#接入研究
|
4月前
|
存储 开发框架 前端开发
基于SqlSugar的开发框架循序渐进介绍(10)-- 利用axios组件的封装,实现对后端API数据的访问和基类的统一封装处理
基于SqlSugar的开发框架循序渐进介绍(10)-- 利用axios组件的封装,实现对后端API数据的访问和基类的统一封装处理