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

  1. 云栖社区>
  2. 博客>
  3. 正文

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

科技小先锋 2017-11-16 19:42:00 浏览528
展开阅读全文

/// <summary>
        
/// 设置回调函数,替换播放器中的显示部分,有用户自己控制显示,该函数在Hik_PlayM4_Play
        
/// 之前调用,在Hik_PlayM4_Stop时自动失效,下次调用Hik_PlayM4_Play之前需要重新设
        
/// 置。注意解码部分不控制速度,只要用户从回调函数中返回,解码器就会解码下一部分数据。这个
        
/// 功能的使用需要用户对视频显示和声音播放有足够的了解,否则请慎重使用,有关知识请参阅directx开发包。
        
/// 
        
/// 24 . BOOL  Hik_PlayM4_SetDecCallBack(LONG nPort,void (CALLBACK* DecCBFun)(long nPort,char * pBuf,long nSize,FRAME_INFO * pFrameInfo, long nReserved1,long nReserved2)); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="dcbf">DecCBFun回调函数指针,不能为NULL</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetDecCallBack(int nPort, DecCBFun dcbf);


        
/// <summary>
        
/// 设置抓图回调函数;注意要尽快返回,如果要停止回调,可以把回调函数指针DisplayCBFun设为NULL。
        
/// 一旦设置回调函数,则一直有效,直到程序退出。该函数可以在任何时候调用。 
        
/// 
        
/// 25 . BOOL Hik_PlayM4_SetDisplayCallBack(LONG nPort,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="dcbf">DisplayCBFun抓图回调函数,可以为NULL。</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetDisplayCallBack(int nPort, DisplayCBFun dcbf);

        
/// <summary>
        
/// 将抓图得到的图像数据保存成BMP文件。转换函数占用的cpu资源,如果不需要保存图片,则不要调用
        
/// 
        
/// 26.BOOL  Hik_PLayM4_ConvertToBmpFile(char * pBuf,long nSize,long nWidth,long nHeight,long nType,char *sFileName); 
        
/// </summary>
        
/// <param name="pBuf">同抓图回调函数中的参数</param>
        
/// <param name="nSize">同抓图回调函数中的参数</param>
        
/// <param name="nWidth">同抓图回调函数中的参数</param>
        
/// <param name="nHeight">同抓图回调函数中的参数</param>
        
/// <param name="nType">同抓图回调函数中的参数</param>
        
/// <param name="sFileName">要保存的文件名。最好以BMP作为文件扩展名。</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PLayM4_ConvertToBmpFile(IntPtr pBuf, int nSize, int nWidth, int nHeight, int nType, string sFileName);

        
/// <summary>
        
/// 得到文件中的总帧数。 
        
/// 
        
/// 27.DWORD Hik_PlayM4_GetFileTotalFrames(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns>文件中的总帧数。 </returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern ushort Hik_PlayM4_GetFileTotalFrames(int nPort);

        
/// <summary>
        
/// 得到当前码流中编码时的帧率。
        
/// 
        
/// 28.DWORD Hik_PlayM4_GetCurrentFrameRate(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns>当前码流中编码时的帧率。 </returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern ushort Hik_PlayM4_GetCurrentFrameRate(int nPort);

        
/// <summary>
        
/// 得到文件当前播放的时间,单位毫秒
        
/// 
        
/// 29.DWORD Hik_PlayM4_GetPlayedTimeEx(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern ushort Hik_PlayM4_GetPlayedTimeEx(int nPort);

        
/// <summary>
        
/// 根据时间设置文件播放位置,此接口比Hik_PlayM4_SetPlayPos费时,但如果用时间来控制播放进度条
        
/// (与Hik_PlayM4_GetPlayedTime(Ex)配合使用),那么可以使进度条平滑滚动。 
        
/// 
        
/// 30.BOOL   Hik_PlayM4_SetPlayedTimeEx(LONG nPort,DWORD nTime); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nTime">设置文件播放位置到指定时间。单位毫秒。</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetPlayedTimeEx(int nPort, ushort nTime);

        
/// <summary>
        
/// 得到当前播放的帧序号,。而Hik_PlayM4_GetPlayedFrames是总共解码的帧数。如果文件播放位置
        
/// 不被改变,那么这两个函数的返回值应该非常接近,除非码流丢失数据。 
        
/// 
        
/// 31.DWORD  Hik_PlayM4_GetCurrentFrameNum(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern ushort Hik_PlayM4_GetCurrentFrameNum(int nPort);

        
/// <summary>
        
/// 设置流播放的模式。必须在播放之前设置。 
        
///     注意:2.2版以后可以做暂停,快放,慢放,单帧播放操作。 
        
/// 
        
/// 32.BOOL Hik_PlayM4_SetStreamOpenMode(LONG nPort,DWORD nMode); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nMode">STREAME_REALTIME实时模式(默认),STREAME_FILE文件模式。</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetStreamOpenMode(int nPort, ushort nMode);

        
/// <summary>
        
/// 得到当前版本播放器能播放的文件的文件头长度。 主要应用在流播放器的STREAME_FILE模式下。
        
/// 以便读出文件头作为Hik_PlayM4_OpenStream()的输入参数。 
        
/// 
        
/// 33.DWORD Hik_PlayM4_GetFileHeadLength(); 
        
/// <example>
        
///  CFile  m_TestFile;
        
/// void Start() 
        
/// { 
        
/// //获得文件头长度; 
        
/// DWORD nLength= Hik_PlayM4_GetFileHeadLength(); 
        
/// PBYTE pFileHead=new BYTE[nLength]; 
        
/// //打开文件; 
        
/// m_TestFile.Open("test.mp4 ", CFile::modeRead,NULL); 
        
/// m_TestFile.Read(pFileHead,nLength); 
        
/// //设置模式 
        
/// Hik_PlayM4_SetStreamOpenMode(0,STREAME_FILE); 
        
/// //打开流接口 
        
/// if(!Hik_PlayM4_OpenStream(0,pFileHead, nLength,1024*100)) 
        
/// { 
        
///  m_strPlayFileName=""; 
        
///  MessageBox("文件打不开"); 
        
/// } 
        
/// //播放 
        
/// m_bPlaying = Hik_PlayM4_Play( 0, m_hWnd); 
        
/// delete []pFileHead; 
        
///}  
        
///  //////////////////////////////////////////////////////////////////////////////
        
///  void InputData() 
        
///  { 
        
///BYTE pBuf[4096]; 
        
/// m_TestFile.Read(pBuf,sizeof(pBuf)); 
        
/// while(!Hik_PlayM4_InputData(0,pBuf,sizeof(pBuf))) 
        
///  }
        
///         { 
        
///  if(!m_bPlaying) 
        
///   break;//如果已经停止播放,则退出; 
        
///  TRACE("SLEEEP \n"); 
        
///  Sleep(5); 
        
/// } 
        
///  } 
        
/// </example>
        
/// </summary>
        
/// <returns>此版本播放器对应的文件头的长度。 </returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern ushort Hik_PlayM4_GetFileHeadLength();


        
/// <summary>
        
/// 得到当前播放器sdk的版本号和build号。如果只是修改bug,我们只升级build号。 
        
/// 
        
/// 34.DWORD Hik_PlayM4_GetSdkVersion(); 
        
/// </summary>
        
/// <returns>高16位表示当前的build号。9~16位表示主版本号,1~8位表示次版本号。如:返回值0x06040105 表示:build号是0604,版本号1.5。 </returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_GetSdkVersion();

        
/// <summary>
        
/// 获得当前错误的错误码。用户应该在调用某个函数失败时,调用此函数以获得错误的详细信息。 
        
/// 
        
/// 35.DWORD Hik_PlayM4_GetLastError(LONG nPort) 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_GetLastError(int nPort);

        
/// <summary>
        
/// 刷新显示。当用户暂停时如果刷新了窗口,则窗口中的图像因为刷新而消失,此时调用这个接口可
        
/// 以重新把图像显示出来。只有在暂停和单帧播放时才会执行, 其它情况会直接返回。 
        
/// 
        
/// 36.BOOL  Hik_PlayM4_RefreshPlay(LONG nPort)
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_RefreshPlay(int nPort);

        
/// <summary>
        
/// 设置OVERLAY模式显示画面。在一块显卡中同一时刻只能有一个OVERLAY表面处于活动状态,
        
/// 如果此时系统中已经有程序使用了OVERLAY,那么播放器就不能再创建OVERLAY表面,它将自
        
/// 动改用Off_Screen表面,并不返回FALSE。一些常用的播放器,以及我们卡的预览都可能使用了
        
/// overlay表面。同样,如果播放器使用了OVERLAY表面,那么,其他的程序将不能使用OVERLAY
        
/// 表面,特别注意,我们的卡在预览时可能也要使用OVERLAY(用户可设置),如果先打开播放器(并
        
/// 且使用了OVERLAY),再启动预览,那么预览可能因为得不到OVERLAY而失败。使用OVERLAY
        
/// 模式的优点是:大部份的显卡都支持OVERLAY,在一些不支持BLT硬件缩放和颜色转换的显卡上 
        
/// (如SIS系列显卡)使用OVERLAY模式(OVERLAY模式下的缩放和颜色转换由显卡支持),可以大
        
/// 大减小cpu利用率并提高画面质量(相对于软件缩放和颜色转换)。缺点是:只能有一路播放器使用。
        
/// 该设置必须在PLAY之前使用,而且需要设置透明色。 
        
/// 
        
/// 37.BOOL  Hik_PlayM4_SetOverlayMode(LONG nPort,BOOL bOverlay,COLORREF colorKey) 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="bOverlay">如果为TRUE,表示将首先尝试使用OVERLAY模式,如果不行再使用其他模式。如果为FALSE,则不进行OVERLAY模式的尝试。 </param>
        
/// <param name="colorKey">
        
///     用户设置的透明色,透明色相当于一层透视膜,显示的画面只能穿过这种颜色,而其他的颜色将
        
///     挡住显示的画面。用户应该在显示窗口中涂上这种颜色,那样才能看到显示画面。一般应该使
        
///     用一种不常用的颜色作为透明色。这是一个双字节值0x00rrggbb,最高字节为0,后三个字节分别表示r,g,b的值。
        
/// </param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetOverlayMode(int nPort, bool bOverlay,int colorKey);

        
/// <summary>
        
/// 获得码流中原始图像的大小,根据此大小来设置显示窗口的区域,可以不用显卡做缩放工作,对于
        
/// 那些不支持硬件缩放的显卡来说非常有用。 
        
/// 
        
/// 38. BOOL  Hik_PlayM4_GetPictureSize(LONG nPort,LONG *pWidth,LONG *pHeight); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="pWidth">原始图像的宽。在PAL制CIF格式下是352。</param>
        
/// <param name="pHeight">原始图像的高。在PAL制CIF格式下是288。</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_GetPictureSize(int nPort, out int pWidth, out int pHeight);

        
/// <summary>
        
/// 设置图像质量,当设置成高质量时画面效果好,但CPU利用率高。在支持多路播放时,可以
        
/// 设为低质量,以降低CPU利用率;当某路放大播放时将该路设置成高质量,以达到好的画面效果。
        
/// 
        
/// 39.BOOL  Hik_PlayM4_SetPicQuality(LONG nPort,BOOL bHighQuality); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="bHighQuality">等于1时图像高质量,等于0时低质量(默认值)。</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetPicQuality(int nPort, bool bHighQuality);

        
/// <summary>
        
/// 以共享方式播放声音,只管播放本路声音而不去关闭其他路的声音。注意:WIN98及其之前
        
/// 版本操作系统不支持创建多个声音设备。如果声卡已经被使用,那么此函数将返回FALSE。
        
/// 
        
/// 40.BOOL Hik_PlayM4_PlaySoundShare(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_PlaySoundShare(int nPort);

        
/// <summary>
        
/// 以共享方式关闭声音。Hik_Playm4_PlaySound和Hik_PlayM4_StopSound是以独占方
        
/// 式播放声音的。注意:在同一个进程中,所有通道必须使用相同的方式播放或关闭声音。
        
/// 
        
/// 41.BOOL  Hik_PlayM4_StopSoundShare(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_StopSoundShare(int nPort);

        
/// <summary>
        
/// 获得流模式类型。 
        
/// 
        
/// 42. LONG  Hik_PlayM4_GetStreamOpenMode(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns>STREAME_REALTIME或STREAME_FILE</returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern int Hik_PlayM4_GetStreamOpenMode(int nPort);

        
/// <summary>
        
/// 检查当前播放器是否使用了OVERLAY模式
        
/// 
        
/// 43.LONG  Hik_PlayM4_GetOverlayMode(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns>0,表示没有使用OVERLAY;1表示使用了OVERLAY表面。</returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern int Hik_PlayM4_GetOverlayMode(int nPort);

        
/// <summary>
        
/// 获得OVERLAY表面使用的透明色
        
/// 
        
/// 44.COLORREF  Hik_PlayM4_GetColorKey(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns>颜色值</returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern Color Hik_PlayM4_GetColorKey(int nPort);

        
/// <summary>
        
/// 获得当前设置的音量


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

网友评论

登录后评论
0/500
评论
科技小先锋
+ 关注