C# 視頻監控系列(11):H264播放器——封裝API[HikPlayM4.dll]

正文

     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);

    
/// <summary>
    
/// void __stdcall  Audio(long nPort, char * pAudioBuf, long nSize, long nStamp, long nType, long nUser) 
    
/// </summary>
    
/// <param name="nPort">通道號</param>
    
/// <param name="pAudioBuf">wave格式音頻數據</param>
    
/// <param name="nSize">音頻數據長度</param>
    
/// <param name="nStamp"> 時標(ms) </param>
    
/// <param name="nType">音頻類型T_AUDIO16, 採樣率16khz,單聲道,每個採樣點16位表示 </param>
    
/// <param name="nUser">用戶自定義數據</param>
    public delegate void Audio(int nPort, string pAudioBuf, int nSize, int nStamp, int nType, int nUser);

    
/// <summary>
    
/// void (CALLBACK *funEncChange)(long nPort,long nUser) 
    
/// </summary>
    
/// <param name="nPort">通道號</param>
    
/// <param name="nUser">用戶自定義數據</param>
    public delegate void EncChange(int nPort, int nUser);

    
/// <summary>
    
/// void(CALLBACK *funGetOrignalFrame)(long nPort,FRAME_TYPE *frameType, long nUser) 
    
/// </summary>
    
/// <param name="nPort">通道號</param>
    
/// <param name="frameType">有關數據幀的信息</param>
    
/// <param name="nUser"></param>
    public delegate void GetOrignalFrame(int nPort, ref FRAME_TYPE frameType, int nUser);


    
#endregion

    
/// <summary>
    
/// 播放器
    
/// </summary>
    public sealed class HikPlayer
    {

        
#region Const Member Variables

        
#region Source buffer

        
//#define SOURCE_BUF_MAX    
        public static readonly uint SOURCE_BUF_MAX = 1024 * 100000;
        
//#define SOURCE_BUF_MIN    1024*50
        public static readonly uint SOURCE_BUF_MIN = 1024 * 50;

        
#endregion

        
#region frame type
        
/// <summary>
        
/// 音頻數據;採樣率16khz,單聲道,每個採樣點16位表示。
        
/// </summary>
        public static readonly int T_AUDIO16 = 101;
        
public static readonly int T_AUDIO8 = 100;

        
/// <summary>
        
/// 視頻數據,uyvy格式。“U0-Y0-V0-Y1-U2-Y2-V2-Y3….”,第一個像素位於圖像左上角。 
        
/// </summary>
        public static readonly int T_UYVY = 1;
        
/// <summary>
        
/// 視頻數據,yv12格式。排列順序“Y0-Y1-……”,“V0-V1….”,“U0-U1-…..”。 
        
/// </summary>
        public static readonly int T_YV12 = 3;
        
/// <summary>
        
/// 視頻數據。每個像素4個字節,排列方式與位圖相似,“B-G-R-0 ……”,第一個像素位於圖像左下角。 
        
/// </summary>
        public static readonly int T_RGB32 = 7;

        
#endregion

        
#region Stream type

        
/// <summary>
        
/// 實時模式,適合播放網絡實時數據,解碼器會立刻解碼。
        
/// </summary>
        public static readonly int STREAME_REALTIME = 0;
        
/// <summary>
        
/// 文件模式,適合用戶把文件數據用流方式輸入。注意:當Hik_PlayM4_InputData()返回FALSE時,用戶要等一下重新輸入。
        
/// </summary>
        public static readonly int STREAME_FILE = 1;

        
#endregion

        
#region Error code

        
/// <summary>
        
/// 沒有錯誤
        
/// </summary>
        public static readonly int HIK_PLAYM4_NOERROR = 0;    //no error
        /// <summary>
        
/// 輸入參數非法
        
/// </summary>
        public static readonly int HIK_PLAYM4_PARA_OVER = 1;    //input parameter is invalid;
        /// <summary>
        
/// 調用順序不對
        
/// </summary>
        public static readonly int HIK_PLAYM4_ORDER_ERROR = 2;    //The order of the function to be called is error.
        /// <summary>
        
/// 多媒體時鐘設置失敗
        
/// </summary>
        public static readonly int HIK_PLAYM4_TIMER_ERROR = 3;    //Create multimedia clock failed;
        /// <summary>
        
/// 視頻解碼失敗
        
/// </summary>
        public static readonly int HIK_PLAYM4_DEC_VIDEO_ERROR = 4;    //Decode video data failed.
        /// <summary>
        
/// 音頻解碼失敗
        
/// </summary>
        public static readonly int HIK_PLAYM4_DEC_AUDIO_ERROR = 5;    //Decode audio data failed.
        /// <summary>
        
/// 分配內存失敗
        
/// </summary>
        public static readonly int HIK_PLAYM4_ALLOC_MEMORY_ERROR = 6;    //Allocate memory failed.
        /// <summary>
        
/// 文件操作失敗
        
/// </summary>
        public static readonly int HIK_PLAYM4_OPEN_FILE_ERROR = 7;    //Open the file failed.
        /// <summary>
        
/// 創建線程事件等失敗
        
/// </summary>
        public static readonly int HIK_PLAYM4_CREATE_OBJ_ERROR = 8;    //Create thread or event failed
        /// <summary>
        
/// 創建directDraw失敗
        
/// </summary>
        public static readonly int HIK_PLAYM4_CREATE_DDRAW_ERROR = 9;    //Create DirectDraw object failed.
        /// <summary>
        
/// 創建後端緩存失敗
        
/// </summary>
        public static readonly int HIK_PLAYM4_CREATE_OFFSCREEN_ERROR = 10;    //failed when creating off-screen surface.
        /// <summary>
        
/// 緩衝區滿,輸入流失敗
        
/// </summary>
        public static readonly int HIK_PLAYM4_BUF_OVER = 11;    //buffer is overflow
        /// <summary>
        
/// 創建音頻設備失敗
        
/// </summary>
        public static readonly int HIK_PLAYM4_CREATE_SOUND_ERROR = 12;    //failed when creating audio device.    
        /// <summary>
        
/// 設置音量失敗
        
/// </summary>
        public static readonly int HIK_PLAYM4_SET_VOLUME_ERROR = 13;    //Set volume failed
        /// <summary>
        
/// 只能在播放文件時才能使用此接口
        
/// </summary>
        public static readonly int HIK_PLAYM4_SUPPORT_FILE_ONLY = 14;    //The function only support play file.
        /// <summary>
        
/// 只能在播放流時才能使用此接口
        
/// </summary>
        public static readonly int HIK_PLAYM4_SUPPORT_STREAM_ONLY = 15;    //The function only support play stream.
        /// <summary>
        
/// 系統不支持,解碼器只能工作在Pentium 3以上
        
/// </summary>
        public static readonly int HIK_PLAYM4_SYS_NOT_SUPPORT = 16;//System not support.
        /// <summary>
        
/// 沒有文件頭
        
/// </summary>
        public static readonly int HIK_PLAYM4_FILEHEADER_UNKNOWN = 17;    //No file header.
        /// <summary>
        
/// 解碼器和編碼器版本不對應
        
/// </summary>
        public static readonly int HIK_PLAYM4_VERSION_INCORRECT = 18;    //The version of decoder and encoder is not adapted.  
        /// <summary>
        
/// 初始化解碼器失敗
        
/// </summary>
        public static readonly int HIK_PALYM4_INIT_DECODER_ERROR = 19;    //Initialize decoder failed.
        /// <summary>
        
/// 文件太短或碼流無法識別
        
/// </summary>
        public static readonly int HIK_PLAYM4_CHECK_FILE_ERROR = 20;    //The file data is unknown.
        /// <summary>
        
/// 初始化多媒體時鐘失敗
        
/// </summary>
        public static readonly int HIK_PLAYM4_INIT_TIMER_ERROR = 21;    //Initialize multimedia clock failed.
        /// <summary>
        
/// 位拷貝失敗
        
/// </summary>
        public static readonly int HIK_PLAYM4_BLT_ERROR = 22;    //Blt failed.
        /// <summary>
        
/// 顯示overlay失敗
        
/// </summary>
        public static readonly int HIK_PLAYM4_UPDATE_ERROR = 23;    //Update failed.
        public static readonly int HIK_PLAYM4_OPEN_FILE_ERROR_MULTI = 24;  //openfile error, streamtype is multi
        public static readonly int HIK_PLAYM4_OPEN_FILE_ERROR_VIDEO = 25//openfile error, streamtype is video
        public static readonly int HIK_PLAYM4_JPEG_COMPRESS_ERROR = 26;   //JPEG compress error
        public static readonly int HIK_PLAYM4_EXTRACT_NOT_SUPPORT = 27;    //Don't support the version of this file.
        public static readonly int HIK_PLAYM4_EXTRACT_DATA_ERROR = 28;    //extract video data failed.

        
#endregion

        
#region Display buffers

        
/// <summary>
        
/// 播放緩衝最大值 
        
/// </summary>
        public static readonly int MAX_DIS_FRAMES = 50;
        
/// <summary>
        
/// 播放緩衝最小值 
        
/// </summary>
        public static readonly int MIN_DIS_FRAMES = 6;

        
#endregion

        
#region Locate by

        
/// <summary>
        
/// 幀號
        
/// </summary>
        public static readonly int BY_FRAMENUM = 1;
        
/// <summary>
        
/// 時間
        
/// </summary>
        public static readonly int BY_FRAMETIME = 2;

        
#endregion

        
#region Display type

        
/// <summary>
        
/// 正常分辨率數據送顯卡顯示。 
        
/// </summary>
        public static readonly int DISPLAY_NORMAL = 1;
        
/// <summary>
        
/// 1/4分辨率數據送顯卡顯示。 
        
/// </summary>
        public static readonly int DISPLAY_QUARTER = 2;

        
#endregion

        
#region Timer type

        
/// <summary>
        
/// 一個進程中只能使用16個,定時比較準,畫面流暢。
        
/// Only 16 timers for every process.Default TIMER;
        
/// </summary>
        public static readonly int TIMER_1 = 1;
        
/// <summary>
        
/// 使用數目沒有限制,定時沒有TIMER_1準。
        
/// Not limit;But the precision less than TIMER_1; 
        
/// </summary>
        public static readonly int TIMER_2 = 2;

        
#endregion

        
#region 緩衝區類型 BUFFER TYPE

        
/// <summary>
        
/// 視頻數據源緩衝區,緩衝解碼之前視頻數據,只對流模式有效,單位byte。
        
/// </summary>
        public static readonly int BUF_VIDEO_SRC = 1;
        
/// <summary>
        
/// 音頻數據源緩衝區,緩衝解碼之前音頻數據,只對流模式有效, 單位byte。 
        
/// </summary>
        public static readonly int BUF_AUDIO_SRC = 2;
        
/// <summary>
        
/// 解碼後視頻數據緩衝區,單位幀數。 
        
/// </summary>
        public static readonly int BUF_VIDEO_RENDER = 3;
        
/// <summary>
        
/// 解碼後音頻數據緩衝區,單位幀數,音頻40ms數據定爲一幀。 
        
/// </summary>
        public static readonly int BUF_AUDIO_RENDER = 4;

        
#endregion

        
#endregion

        
public static readonly uint WM_USER = 0x0400;
        
public static readonly uint WM_FILE_END = WM_USER + 33;
        
public static readonly uint WM_ENC_CHANGE = WM_USER + 100;
        
public static readonly int WINVER = 0x0400;

        
#region 縮進

        
/// 初始化DirectDraw表面。在使用vb,delphi開發時請注意,它們生成的對話框具有WS_CLIPCHILDREN
        
/// 窗口風格,必須去掉這種風格,否則顯示畫面會被對話框上的控件覆蓋。注意:1.1版以上不需要調用。
        
/// 
        
/// 1、 BOOL Hik_PlayM4_InitDDraw(HWND hWnd);
        
/// </summary>
        
/// <param name="hWnd">hWnd 應用程序主窗口的句柄。</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_InitDDraw(IntPtr hWnd);

        
/// <summary>
        
/// 釋放directDraw表面;注意:1.1版以上不需要調用。
        
/// 
        
/// 2、 BOOL Hik_PlayM4_RealeseDDraw(); 
        
/// </summary>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_RealeseDDraw();

        
/// <summary>
        
/// 打開播放文件
        
/// 
        
/// 3、 BOOL Hik_PlayM4_OpenFile(LONG nPort,LPSTR sFileName); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="sFileName">文件名,文件不能超過4G或小於4K</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_OpenFile(int nPort, string sFileName);

        
/// <summary>
        
/// 關閉播放文件
        
/// 
        
/// 4、 BOOL Hik_PlayM4_CloseFile(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_CloseFile(int nPort);

        
/// <summary>
        
/// 播放開始,播放視頻畫面大小將根據hWnd窗口調整,要全屏顯示,只要把hWnd窗口放大到全屏。
        
///     如果已經播放,只是改變當前播放速度爲正常速度。 
        
///     輸入參數:hWnd 播放視頻的窗口句柄。 
        
/// 
        
/// 5、 BOOL Hik_PlayM4_Play(LONG nPort, HWND hWnd); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="hWnd"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_Play(int nPort, IntPtr hWnd);

        
/// <summary>
        
/// 播放結束
        
/// 
        
/// 6、 BOOL Hik_PlayM4_Stop(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_Stop(int nPort);

        
/// <summary>
        
/// 播放暫停/恢復
        
/// 
        
/// 7、 BOOL Hik_PlayM4_Pause(LONG nPort,DWORD nPause); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nPause">TRUE暫停,否則恢復</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_Pause(int nPort, bool nPause);

        
/// <summary>
        
/// 快速播放,每次調用將使當前播放速度加快一倍,最多調用4次;要恢復正常播放調用
        
/// Hik_PlayM4_Play(),從當前位置開始正常播放
        
/// 
        
/// 8、 BOOL Hik_PlayM4_Fast(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_Fast(int nPort);

        
/// <summary>
        
/// 慢速播放,每次調用將使當前播放速度慢一倍;最多調用4次;要恢復正常播放調用Hik_PlayM4_Play
        
/// 
        
/// 9、 BOOL Hik_PlayM4_Slow(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_Slow(int nPort);

        
/// <summary>
        
/// 設置文件播放指針的相對位置(百分比)。 
        
/// 
        
/// 10、BOOL Hik_PlayM4_SetPlayPos(LONG nPort,float fRelativePos); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="fRelativePos">範圍0-100%  0-1 之間</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetPlayPos(int nPort, float fRelativePos);

        
/// <summary>
        
/// 獲得文件播放指針的相對位置
        
/// 
        
/// 11、float Hik_PlayM4_GetPlayPos(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort">範圍0-100%</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern float Hik_PlayM4_GetPlayPos(int nPort);

        
/// <summary>
        
/// 說明:設置文件結束時要發送的消息;從2.4版開始,當文件播放完時,解碼線程將不會自動結束,需要
        
/// 用戶做停止工作:應用程序在收到這個消息後要調用播放結束函數Hik_PlayM4_Stop(nPort)。 
        
/// 
        
/// 12、BOOL Hik_PlayM4_SetFileEndMsg(LONG nPort,HWND hWnd,UINT nMsg); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="hWnd">消息發送的窗口。 </param>
        
/// <param name="nMsg">用戶自定義的輸入的消息;當播放到文件結束時用戶從hWnd窗口過程中收到這個消息。此消息函數中的wParam參數返回nPort的值。</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetFileEndMsg(int nPort, IntPtr hWnd, uint nMsg);

        
/// <summary>
        
/// 設置音量;可以在播放之前設置,返回值是FALSE,但設置的值被保存,並作爲啓動聲音時的初始
        
/// 
        
/// 13、BOOL Hik_PlayM4_SetVolume(LONG nPort,WORD nVolume); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nVolume">nVolume 音量的值,範圍0-0XFFFF</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetVolume(int nPort, int nVolume);

        
/// <summary>
        
/// 打開聲音;同一時刻只能有一路聲音。如果現在已經有聲音打開,則自動關閉原來已經打開的聲音。
        
///     注意:默認情況下聲音是關閉的! 
        
/// 
        
/// 14.BOOL  Hik_PlayM4_PlaySound(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_PlaySound(int nPort);

        
/// <summary>
        
/// 關閉聲音
        
/// 
        
/// 15.BOOL  Hik_PlayM4_StopSound(); 
        
/// </summary>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_StopSound();

        
/// <summary>
        
/// 打開流接口(類似打開文件)
        
/// 
        
/// 16.BOOL  Hik_PlayM4_OpenStream(LONG nPort,PBYTE pFileHeadBuf,DWORD nSize,DWORD nBufPoolSize); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="pFileHeadBuf">用戶從卡上得到的文件頭數據。</param>
        
/// <param name="nSize">文件頭長度。</param>
        
/// <param name="nBufPoolSize">設置播放器中存放數據流的緩衝區大小。範圍是SOURCE_BUF_MIN~ SOURCE_BUF_MAX。 </param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_OpenStream(int nPort, IntPtr pFileHeadBuf, ushort nSize, ushort nBufPoolSize);


        
/// <summary>
        
/// 輸入從卡上得到的流數據;打開流之後才能輸入數據。
        
/// 
        
/// 17.BOOL  Hik_PlayM4_InputData(LONG nPort,PBYTE pBuf,DWORD nSize); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="pBuf">緩衝區地址</param>
        
/// <param name="nSize">緩衝區大小</param>
        
/// <returns>TURE,表示已經輸入數據。FALSE 表示失敗,數據沒有輸入。</returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_InputData(int nPort, IntPtr pBuf, ushort nSize);

        
/// <summary>
        
/// 關閉數據流
        
/// 
        
/// 18.BOOL  Hik_PlayM4_CloseStream(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_CloseStream(int nPort);

        
/// <summary>
        
/// 測試播放器需要的一些系統功能 
        
///    注意:如果顯卡支持上面列出的顯示功能,將會大大降低CPU利用率。解碼後的圖像是352*288(PAL)
        
///    大小,如果顯卡不支持放大縮小,則建議顯示窗口也使用352*288。 
        
/// 
        
/// 19.int    Hik_PlayM4_GetCaps(); 
        
/// </summary>
        
/// <returns>
        
/// 1~8位分別表示以下信息(位與是TRUE表示支持): 
        
///    SUPPORT_DDRAW   支持DIRECTDRAW;如果不支持,則播放器不能工作。 
        
///    SUPPORT_BLT          顯卡支持BLT操作;如果不支持,則播放器不能工作。 
        
///    SUPPORT_BLTFOURCC   顯卡BLT支持顏色轉換;如果不支持,播放器會使用軟件方式作RGB轉換。
        
///    SUPPORT_BLTSHRINKX 顯卡BLT支持X軸縮小;如果不支持,系統使用軟件方式轉換。
        
///    SUPPORT_BLTSHRINKY   顯卡BLT支持Y軸縮小;如果不支持,系統使用軟件方式轉換。 
        
///    SUPPORT_BLTSTRETCHX 顯卡BLT支持X軸放大;如果不支持,系統使用軟件方式轉換。
        
///    SUPPORT_BLTSTRETCHY  顯卡BLT支持Y軸放大;如果不支持,系統使用軟件方式轉換。 
        
///    SUPPORT_SSE           CPU支持SSE指令,Intel Pentium3以上支持SSE指令; 
        
///    SUPPORT_MMX    CPU支持MMX指令集。 
        
/// 
        
/// </returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern int Hik_PlayM4_GetCaps();

        
/// <summary>
        
/// 得到文件總的時間長度,單位秒
        
/// 
        
/// 20.DWORD  Hik_PlayM4_GetFileTime(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern int Hik_PlayM4_GetFileTime(int nPort);



        
/// <summary>
        
/// 得到文件當前播放的時間,單位秒
        
/// 
        
/// 21. DWORD  Hik_PlayM4_GetPlayedTime(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern ushort Hik_PlayM4_GetPlayedTime(int nPort);

        
/// <summary>
        
/// 得到已經解碼的視頻幀數
        
/// 
        
/// 22.DWORD  Hik_PlayM4_GetPlayedFrames(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern ushort Hik_PlayM4_GetPlayedFrames(int nPort);

        
/// <summary>
        
/// 單幀播放。要恢復正常播放調用Hik_PlayM4_Play()
        
/// 
        
/// 23.BOOL  Hik_PlayM4_OneByOne(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_OneByOne(int nPort);

        
/// <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>
        
/// 獲得當前設置的音量
        
/// 
        
/// 45.WORD Hik_PlayM4_GetVolume(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort">音量值</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_GetVolume(int nPort);

        
/// <summary>
        
/// 獲得當前圖像質量
        
/// 
        
/// 46.BOOL  Hik_PlayM4_GetPictureQuality(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_GetPictureQuality(int nPort, out bool bHighQuality);

        
/// <summary>
        
/// 獲得流播放模式下源緩衝剩餘數據
        
/// 
        
/// 47.DWORD Hik_PlayM4_GetSourceBufferRemain(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns>當前源緩衝的大小(BYTE)</returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern ushort Hik_PlayM4_GetSourceBufferRemain(int nPort);

        
/// <summary>
        
/// 清除流播放模式下源緩衝區剩餘數據 
        
/// 
        
/// 48.BOOL Hik_PlayM4_ResetSourceBuffer(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_ResetSourceBuffer(int nPort);

        
/// <summary>
        
/// 設置源緩衝區閥值和剩餘數據小於等於閥值時的回調函數指針
        
/// 
        
/// 49.BOOL Hik_PlayM4_SetSourceBufCallBack(LONG nPort,DWORD nThreShold,void (CALLBACK * SourceBufCallBack)(long nPort,DWORD nBufSize,DWORD dwUser,void*pResvered),DWORD dwUser,void *pReserved); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nThreShold">閥值</param>
        
/// <param name="sbcb">回調函數指針</param>
        
/// <param name="dwUser">用戶數據</param>
        
/// <param name="pReserved">保留數據</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetSourceBufCallBack(int nPort, ushort nThreShold, SourceBufCallBack sbcb, ushort dwUser, IntPtr pReserved);

        
/// <summary>
        
/// 重置回調標誌位爲有效狀態。流模式下源緩衝到達閥值時(如果用戶設置了回調函數)不一定會回調,
        
/// 用戶需要重置回調標誌位後才能回調。而且每次回調後標誌位都被設爲無效,用戶可以
        
/// 在適當的時候重置回調標誌,這個接口的主要目的是防止重複回調(數據在閥值附近擺動因爲用戶
        
/// 輸入數據時,播放器也在讀走數據)。初始化狀態下,回調標誌位是有效的。 
        
/// 
        
/// 50.BOOL  Hik_PlayM4_ResetSourceBufFlag(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_ResetSourceBufFlag(int nPort);

        
/// <summary>
        
/// 設置播放緩衝區(即解碼後的圖像緩衝區)大小;這個緩衝區比較重要,他直接影響播放的
        
/// 流暢性和延時性。在一定範圍內緩衝越大越流暢,同時延時越大。在播放文件時用戶最好可以考
        
/// 慮開大緩衝(如果內存足夠大),我們的默認值是15(幀),在25幀/秒的情況下即0.6秒的數據。
        
/// 在播放流時我們的默認值是10(幀),如果用戶追求最大延時最小,可以考慮試當減小這個值。 
        
/// 輸入參數:nNum 播放緩衝區最大緩衝幀數。範圍:MIN_DIS_FRAMES ~MAX_DIS_FRAMES。一幀
        
/// 352*288圖像的所需內存最小值是 352*288*3/2大約150K 。最大值是352*288*4大約405K。 
        
/// 
        
/// 51.BOOL  Hik_PlayM4_SetDisplayBuf(LONG nPort,DWORD nNum); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nNum"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetDisplayBuf(int nPort, ushort nNum);

        
/// <summary>
        
/// 獲得播放緩衝區最大緩衝的幀數
        
/// 
        
/// 52.DWORD  Hik_PlayM4_GetDisplayBuf(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns>播放緩衝區最大緩衝幀數</returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern ushort Hik_PlayM4_GetDisplayBuf(int nPort);

        
/// <summary>
        
/// 設置回調函數指針,文件索引建立後回調。爲了能在文件中準確快速的定位,我們在文件打
        
/// 開的時候生成文件索引。這個過程耗時比較長,大約每秒處理40M左右的數據,主要是因爲從硬盤
        
/// 讀數據比較慢。建立索引的過程是在後臺完成,需要使用索引的函數要等待這個過程結束,而其他接口不會受到影響。 
        
/// 
        
/// 53.BOOL Hik_PlayM4_SetFileRefCallBack(LONG nPort,  void (__stdcall *pFileRefDone) (DWORD nPort,DWORD nUser),DWORD nUser); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="frd">回調函數指針</param>
        
/// <param name="nUser">用戶數據</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetFileRefCallBack(int nPort, FileRefDone frd, ushort nUser);

        
/// <summary>
        
/// 單幀回放。每調用一次倒退一幀。此函數必須在文件索引生成之後才能調用。雖然
        
/// SetCurrentFrameNum也可以做到單幀回退,但效率要低很多。在單幀回放時我們建議使用這個接口。
        
/// 
        
/// 54.BOOL  Hik_PlayM4_OneByOneBack(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_OneByOneBack(int nPort);

        
/// <summary>
        
/// 設置當前播放播放位置到指定幀號;根據幀號來定位播放位置。此函數必須在文件索引生成之後才能調用
        
/// 
        
/// 55.BOOL  Hik_PlayM4_SetCurrentFrameNum(LONG nPort,DWORD nFrameNum); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nFrameNum">幀序號</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetCurrentFrameNum(int nPort, int nFrameNum);

        
/// <summary>
        
/// 查找指定位置之前的關鍵幀位置。圖像解碼必須從關鍵幀開始,如果用戶保存的文件不是從
        
/// 關鍵幀開始的,那麼倒下一個關鍵幀之前的數據會被忽略。如果用戶要截取文件中的一段數據,
        
/// 則應該考慮從關鍵幀開始截取。結束位置則關係不大,最多丟失3幀數據。 
        
/// 
        
/// 56.BOOL  Hik_PlayM4_GetKeyFramePos(LONG nPort,DWORD nValue, DWORD nType, PFRAME_POS pFramePos); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nValue">當前位置,可以是時間或幀號,類型由nType指定。</param>
        
/// <param name="nType">指定nValue的類型。如果nType 是BY_FRAMENUM則nValue表示幀號BY_FRAMTIME,則nValue表示時間,單位ms。 </param>
        
/// <param name="pFramePos">查找到的關鍵幀的文件位置,幀序號,時標信息。 </param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_GetKeyFramePos(int nPort, ushort nValue, ushort nType, ref PFRAME_POS pFramePos);

        
/// <summary>
        
/// 查找指定位置之後的關鍵幀位置。 
        
/// 
        
/// 57.BOOL  Hik_PlayM4_GetNextKeyFramePos(LONG nPort,DWORD nValue, DWORD nType, PFRAME_POS pFramePos); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nValue">當前位置,可以是時間或幀號,類型由nType指定。</param>
        
/// <param name="nType">指定nValue的類型。如果nType 是BY_FRAMENUM則nValue表示幀號,如果nType 是Y_FRAMTIME,則nValue表示時間,單位ms。</param>
        
/// <param name="pFramePos">查找到的關鍵幀的文件位置,幀序號,時標信息。</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_GetNextKeyFramePos(int nPort, ushort nValue, ushort nType, ref PFRAME_POS pFramePos);

        
/// <summary>
        
/// 設置不解碼B幀幀數;不解碼B幀,可以減小CPU利用率,如果碼流中沒有B幀,那麼設
        
/// 置這個值將不會有作用。如在快速播放,和支持多路而CPU利用率太高的情況下可以考慮使用。 
        
/// 
        
/// 注意:59~64幾個函數接口,是爲支持多顯卡而增加的。Windows98,Windows2000及Windows2000之後的
        
/// 操作系統才支持多顯卡,並需要安裝DirectX6.0或更高版本。如果用戶不需支持多顯卡環境,則這幾個接
        
/// 口可以不予考慮。關於多顯卡的編程請參考Microsoft sdk相關文檔"Multiple-Monitor Systems"
        
/// 
        
/// 58 .BOOL Hik_PlayM4_ThrowBFrameNum(LONG nPort,DWORD nNum); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nNum">不解碼B幀的幀數。nNum 對於我們的DS-400XM系列板卡採集的文件,nNum範圍是0~2。</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_ThrowBFrameNum(int nPort, ushort nNum);

        
/// <summary>
        
/// 枚舉系統中的顯示設備。
        
/// 
        
/// 59.BOOL  Hik_PlayM4_InitDDrawDevice(); 
        
/// </summary>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_InitDDrawDevice();

        
/// <summary>
        
/// 釋放枚舉顯示設備的過程中分配的資源。
        
/// 
        
/// 60.void  Hik_PlayM4_ReleaseDDrawDevice(); 
        
/// </summary>
        [DllImport("HikPlayM4.dll")]
        
public static extern void Hik_PlayM4_ReleaseDDrawDevice();

        
/// <summary>
        
/// 獲得系統中與windows桌面綁定的總的顯示設備數目(這裏主要是指顯卡)
        
/// 
        
/// 61.DWORD  Hik_PlayM4_GetDDrawDeviceTotalNums(); 
        
/// </summary>
        
/// <returns>
        
///     如果返回0,則表示系統中只有主顯示設備。如果返回1,則表示系統中安裝了多塊顯卡
        
///     但只有一塊顯卡與Windows桌面綁定。返回其他值,則表示系統中與桌面綁定的顯卡數目。在多顯卡
        
///     的系統中可以通過設置顯示屬性,而指定任意一塊顯卡作爲主顯示設備。 
        
/// </returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern ushort Hik_PlayM4_GetDDrawDeviceTotalNums();

        
/// <summary>
        
/// 設置播放窗口使用的顯卡。注意:該窗口必須在該顯卡所對應的監視器上才能顯示播放畫面。
        
/// 
        
/// 62.BOOL  Hik_PlayM4_SetDDrawDevice(LONG nPort,DWORD nDeviceNum); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nDeviceNum">顯示設備的設備號,如果是0,則表示使用主顯示設備。</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetDDrawDevice(int nPort, ushort nDeviceNum);

        
/// <summary>
        
/// 得到指定顯卡和監視器信息
        
/// 
        
/// 63 . BOOL  Hik_PlayM4_GetDDrawDeviceInfo(DWORD nDeviceNum,LPSTR lpDriverDescription,DWORD nDespLen,LPSTR lpDriverName ,DWORD nNameLen,HMONITOR *hhMonitor); 
        
/// </summary>
        
/// <param name="nDeviceNum">顯示設備的設備號,如果是0,則表示主顯示設備。</param>
        
/// <param name="lpDriverDescription">輸出參數:顯示設備的描述信息。 </param>
        
/// <param name="nDespLen">表示lpDriverDescription已分配空間的大小,單位byte。</param>
        
/// <param name="lpDriverName">輸出參數:顯示設備的設備名。 </param>
        
/// <param name="nNameLen">表示lpDriverName已分配空間的大小,單位byte。</param>
        
/// <param name="hhMonitor">
        
///     顯示設備使用的監視器句柄,通過Windows API 函數GetMonitorInfo,可以得到詳細信息,供用戶定位窗口位置。
        
///     注意:HMONITOR類型 ,當_WIN32_WINNT >= 0x0500時,在“windef.h”頭文件中定義,否則在“Multimon.H”中定義,如果用戶在編譯過程中找不到該類型定義,可以包含相應的頭文件。 
        
/// </param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_GetDDrawDeviceInfo(ushort nDeviceNum, string lpDriverDescription, ushort nDespLen, string lpDriverName, ushort nNameLen, IntPtr hhMonitor);

        
/// <summary>
        
/// 獲得指定顯示設備的系統信息,支持多顯卡。 
        
/// 
        
/// 64.int    Hik_PlayM4_GetCapsEx(DWORD nDDrawDeviceNum); 
        
/// </summary>
        
/// <param name="nDDrawDeviceNum">指定顯示設備的設備號,如果是0,則表示主顯示設備。</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern int Hik_PlayM4_GetCapsEx(ushort nDDrawDeviceNum);

        
/// <summary>
        
/// 設置顯示的模式,在小畫面顯示時,採用DISPLAY_QUARTER 可以減小顯卡工作量,從而
        
/// 支持更多路顯示,但畫面顯示質量有下降。在正常和大畫面顯示時應該使用DISPLAY_NORMAL。 
        
/// 
        
/// 65. BOOL Hik_PlayM4_SetDisplayType(LONG nPort,LONG nType); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nType">nType 兩種模式,DISPLAY_NORMAL或DISPLAY_QUARTER。</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetDisplayType(int nPort, int nType);

        
/// <summary>
        
/// 獲得目前設置的顯示模式。 
        
/// 
        
/// 66.long Hik_PlayM4_GetDisplayType(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns>DISPLAY_NORMAL 或 DISPLAY_QUARTER </returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern int Hik_PlayM4_GetDisplayType(int nPort);

        
/// <summary>
        
/// 設置解碼回調的流類型。
        
/// 
        
/// 67. BOOL __stdcall Hik_PlayM4_SetDecCBStream(LONG nPort,DWORD nStream); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nStream">1視頻流,2音頻流,3複合流</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetDecCBStream(int nPort, ushort nStream);

        
/// <summary>
        
/// 設置或增加顯示區域。可以做局部放大顯示。
        
/// 
        
/// 68.BOOL __stdcall Hik_PlayM4_SetDisplayRegion(LONG nPort,DWORD nRegionNum, RECT *pSrcRect, HWND hDestWnd, BOOL bEnable); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nRegionNum">
        
///     顯示區域序號,0~(MAX_DISPLAY_WND-1)。nRegionNum如果nRegionNum爲0,表示對主要顯示窗口(Hik_PlayM4_Play中設置的窗口)進行設置,
        
///     將忽略hDestWnd和bEnable的設置。 
        
/// </param>
        
/// <param name="pSrcRect">
        
///      設置在要顯示的原始圖像上的區域,如:如果原始圖像是352*288,那麼pSrcRect可設置的範圍只能在(0,0,352,288)之中。如果pSrcRect=NULL,將顯示整個圖像。 
        
/// </param>
        
/// <param name="hDestWnd">設置顯示窗口。如果該區域的窗口已經設置過(打開過),那麼該參數被忽略。</param>
        
/// <param name="bEnable">打開(設置)或關閉顯示區域。</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetDisplayRegion(int nPort, ushort nRegionNum, ref Rectangle pSrcRect, IntPtr hDestWnd, bool bEnable);

        
/// <summary>
        
/// 刷新顯示,同36。爲支持Hik_PlayM4_SetDisplayRegion而增加一個參數。 
        
/// 
        
/// 69.BOOL __stdcall Hik_PlayM4_RefreshPlayEx(LONG nPort,DWORD nRegionNum); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nRegionNum">顯示區域序號。</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_RefreshPlayEx(int nPort, ushort nRegionNum);

        
/// <summary>
        
/// 設置播放窗口使用的顯卡,同62。爲支持Hik_PlayM4_SetDisplayRegion而增加一個參數。
        
/// 
        
/// 70.BOOL __stdcall Hik_PlayM4_SetDDrawDeviceEx(LONG nPort,DWORD nRegionNum,DWORD nDeviceNum); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nRegionNum">顯示區域序號。 </param>
        
/// <param name="nDeviceNum"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetDDrawDeviceEx(int nPort, ushort nRegionNum, ushort nDeviceNum);

        
/// <summary>
        
/// 以音視頻分開輸入的方式打開流。 
        
/// 
        
/// 71.BOOL __stdcall Hik_PlayM4_OpenStreamEx(LONG nPort,PBYTE pFileHeadBuf,DWORD nSize,DWORD nBufPoolSize); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="pFileHeadBuf">用戶從卡上得到的文件頭數據。 </param>
        
/// <param name="nSize">文件頭長度。 </param>
        
/// <param name="nBufPoolSize"> 設置播放器中存放數據流的緩衝區大小。範圍是SOURCE_BUF_MIN~ SOURCE_BUF_MAX。 </param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_OpenStreamEx(int nPort, IntPtr pFileHeadBuf, ushort nSize, ushort nBufPoolSize);

        
/// <summary>
        
/// 關閉數據流
        
/// 
        
/// 72.BOOL __stdcall Hik_PlayM4_CloseStreamEx(LONG nPort); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_CloseStreamEx(int nPort);

        
/// <summary>
        
/// 輸入從卡上得到的視頻流 (可以是複合流,但音頻數據會被忽略);打開流之後才能輸入數據。
        
/// 
        
/// 73.BOOL __stdcall Hik_PlayM4_InputVideoData(LONG nPort,PBYTE pBuf,DWORD nSize); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="pBuf">緩衝區地址</param>
        
/// <param name="nSize">緩衝區大小</param>
        
/// <returns>TURE,表示已經輸入數據。FALSE 表示失敗,數據沒有輸入。</returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_InputVideoData(int nPort, IntPtr pBuf, ushort nSize);

        
/// <summary>
        
/// 輸入從卡上得到的音頻流;打開聲音之後才能輸入數據。 
        
/// 
        
/// 74.BOOL __stdcall Hik_PlayM4_InputAudioData(LONG nPort,PBYTE pBuf,DWORD nSize); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="pBuf">緩衝區地址</param>
        
/// <param name="nSize">緩衝區大小</param>
        
/// <returns>返回值:TURE,表示已經輸入數據。FALSE 表示失敗,數據沒有輸入。</returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_InputAudioData(int nPort, IntPtr pBuf, ushort nSize);

        
/// <summary>
        
/// 註冊一個回調函數,獲得當前表面的device context, 你可以在這個DC上畫圖(或寫字),就好
        
/// 像在窗口的客戶區DC上繪圖,但這個DC不是窗口客戶區的DC,而是DirectDraw裏的
        
/// Off-Screen表面的DC。注意,如果是使用overlay表面,這個接口無效,你可以直接在窗口上繪圖,只要不是透明色就不會被覆蓋。 
        
/// 
        
/// 75.BOOL __stdcall Hik_PlayM4_RigisterDrawFun(LONG nPort,void (CALLBACK* DrawFun)(long nPort,HDC hDc,LONG nUser),LONG nUser); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="df">回調函數句柄。 </param>
        
/// <param name="nUser">用戶數據</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_RigisterDrawFun(int nPort, DrawFun df, int nUser);

        
/// <summary>
        
/// 獲取文件索引信息,以便下次打開同一個文件時直接使用這個信息。必須在索引建成後才能獲得信息。 
        
/// 
        
/// 76.BOOL __stdcall Hik_PlayM4_GetRefValue(LONG nPort,BYTE *pBuffer, DWORD *pSize); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="pBuffer">索引信息</param>
        
/// <param name="pSize">
        
///     輸入/輸出參數:輸入pBuffer的大小,輸出索引信息大小。
        
///     注:可以在第一次指定pSize=0,pBuffer=NULL
        
///     從pSize的返回值獲得需要的緩衝區大小。然後分配足夠的緩衝,再調用一次 
        
/// </param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_GetRefValue(int nPort, IntPtr pBuffer, ref ushort pSize);


        
/// <summary>
        
/// 設置文件索引。如果已經有了文件索引信息,可以不再調用生成索引的回調函數(53.Hik_PlayM4_SetFileRefCallBack),直接輸入索引信息。
        
///     注:索引信息及其長度必須準確 
        
/// 
        
/// 77.BOOL __stdcall Hik_PlayM4_SetRefValue(LONG nPort,BYTE *pBuffer, DWORD nSize); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="pBuffer">索引信息。</param>
        
/// <param name="nSize">索引信息的長度</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetRefValue(int nPort, IntPtr pBuffer, ushort nSize);


        
/// <summary>
        
/// 設置播放器使用的定時器;注意:必須在Open之前調用
        
/// 
        
/// 78.BOOL __stdcall Hik_PlayM4_SetTimerType(LONG nPort,DWORD nTimerType,DWORD nReserved); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nTimerType">TIMER_1或TIMER_2,見宏定義。默認情況下0~15路使用TIMER_1,其餘使用TIMER_2。</param>
        
/// <param name="nReserved">保留</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetTimerType(int nPort, ushort nTimerType, ushort nReserved);

        
/// <summary>
        
/// 獲得當前通道使用的定時器。 
        
/// 
        
/// 79.BOOL __stdcall Hik_PlayM4_GetTimerType(LONG nPort,DWORD *pTimerType,DWORD *pReserved); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="pTimerType">TIMER_1或TIMER_2</param>
        
/// <param name="pReserved">保留</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_GetTimerType(int nPort, out ushort pTimerType, out ushort pReserved);

        
/// <summary>
        
/// 清空播放器中的緩衝區。
        
/// 
        
/// 80.BOOL __stdcall Hik_PlayM4_ResetBuffer(LONG nPort,DWORD nBufType); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nBufType">緩衝區類型</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_ResetBuffer(int nPort, int nBufType);

        
#endregion

        
/// <summary>
        
/// 獲取播放器中的緩衝區大小(幀數或者byte)。這個接口可以幫助用戶瞭解緩衝區中的數據,從而在網絡延時方面有所估計。 
        
/// 
        
/// 81.DWORD __stdcall Hik_PlayM4_GetBufferValue(LONG nPort,DWORD nBufType); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nBufType">緩衝區類型</param>
        
/// <returns>根據參數不同,返回緩衝區值,源緩衝區返回byte,解碼後緩衝區返回幀數。</returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern ushort Hik_PlayM4_GetBufferValue(int nPort, ushort nBufType);

        
/// <summary>
        
/// 調整WAVE波形,可以改變聲音的大小。它和Hik_PlayM4_SetVolume的不同在於,它是調整聲音數據,
        
/// 只對該路其作用,而Hik_PlayM4_SetVolume是調整聲卡音量,對整個系統起作用。
        
///     注意,用這個函數會破壞音質,除非想每路單獨調整音量,否則請謹慎使用。 
        
/// 
        
/// 82.BOOL __stdcall Hik_PlayM4_AdjustWaveAudio(LONG nPort,LONG nCoefficient); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nCoefficient">調整的參數,範圍從MIN_WAVE_COEF 到 MAX_WAVE_COEF,0是不調整。</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_AdjustWaveAudio(int nPort, int nCoefficient);


        
/// <summary>
        
/// 註冊一個回調函數,校驗數據是否被修改,實現水印功能。現在可以發現數據丟失情況。
        
///     注意,該校驗在建立文件索引的時候進行,所以必須建文件索引才能校驗。在openfile之前使用。 
        
/// 
        
/// 83.BOOL __stdcall Hik_PlayM4_SetVerifyCallBack(LONG nPort, DWORD nBeginTime, DWORD nEndTime, void (__stdcall* funVerify)(long nPort, FRAME_POS * pFilePos, DWORD bIsVideo, DWORD nUser),  DWORD  nUser); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nBeginTime">校驗開始時間,單位ms</param>
        
/// <param name="nEndTime">校驗結束時間,單位ms</param>
        
/// <param name="vfy">當發現數據被修改時回調的函數</param>
        
/// <param name="nUser">用戶數據</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetVerifyCallBack(int nPort, uint nBeginTime, uint nEndTime, Verify vfy, uint nUser);

        
/// <summary>
        
/// 音頻幀解碼後的wave數據回調
        
/// 
        
/// 84.BOOL __stdcall Hik_PlayM4_SetAudioCallBack(LONG nPort, void (__stdcall * funAudio)(long nPort, char * pAudioBuf, long nSize, long nStamp, long nType, long nUser), long nUser); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nBufType"></param>
        
/// <param name="ado">音頻回調函數</param>
        
/// <param name="nUser">用戶自定義數據</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetAudioCallBack(int nPort, Audio ado, int nUser);

        
/// <summary>
        
/// 解碼時圖象格式發生改變通知用戶的回調函數;在打開文件前使用
        
/// 
        
/// 85. BOOL __stdcall Hik_PlayM4_SetEncTypeChangeCallBack(LONG nPort,void(CALLBACK *funEncChange)(long nPort,long nUser),long nUser); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="ec">回調函數</param>
        
/// <param name="nUser">用戶自定義數據</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetEncTypeChangeCallBack(int nPort, EncChange ec, int nUser);

        
/// <summary>
        
/// 設置圖象的視頻參數,即時起作用
        
///     注意: 如果全部爲默認值將不進行顏色調節
        
/// 
        
/// 86.BOOL __stdcall Hik_PlayM4_SetColor(LONG nPort, DWORD nRegionNum, int nBrightness, int nContrast, int nSaturation, int nHue); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nRegionNum">顯示區域,參考Hik_PlayM4_SetDisplayRegion;如果只有一個顯示區域(通常情況)設爲0</param>
        
/// <param name="nBrightness">亮度,默認64; 範圍0-128</param>
        
/// <param name="nContrast">對比度,默認64; 範圍0-128</param>
        
/// <param name="nSaturation">飽和度,默認64; 範圍0-128</param>
        
/// <param name="nHue">色調,默認64; 範圍0-128</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetColor(int nPort, ushort nRegionNum, int nBrightness, int nContrast, int nSaturation, int nHue);


        
/// <summary>
        
/// 相應的獲得顏色值,參數同上
        
/// 
        
/// 87.BOOL __stdcall Hik_PlayM4_GetColor(LONG nPort, DWORD nRegionNum, int *pBrightness, int *pContrast, int *pSaturation, int *pHue); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="nRegionNum">顯示區域,參考Hik_PlayM4_SetDisplayRegion;如果只有一個顯示區域(通常情況)設爲0</param>
        
/// <param name="nBrightness">亮度,默認64; 範圍0-128</param>
        
/// <param name="nContrast">對比度,默認64; 範圍0-128</param>
        
/// <param name="nSaturation">飽和度,默認64; 範圍0-128</param>
        
/// <param name="nHue">色調,默認64; 範圍0-128</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_GetColor(int nPort, ushort nRegionNum, out int pBrightness, out int pContrast, out int pSaturation, out int pHue);

        
/// <summary>
        
/// 設置解碼時編碼格式發生改變時要發送的消息。 
        
/// 
        
/// 88.BOOL __stdcall Hik_PlayM4_SetEncChangeMsg(LONG nPort,HWND hWnd,UINT nMsg) 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="hWnd">消息發送的窗口。</param>
        
/// <param name="nMsg">用戶輸入的消息,當設置解碼時編碼格式發生改變時要發送此定義的消息。消息函數中的wParam參數值是返回nPort的值。 </param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetEncChangeMsg(int nPort, IntPtr hWnd, uint nMsg);


        
/// <summary>
        
/// 創建得到原始幀數據的回調函數,可以改變每幀的時標和幀號,在文件打開之後調用。用於將兩個文件拼接在一起。
        
/// 
        
/// 89. BOOL _stdcall Hik_PlayM4_GetOriginalFrameCallBack(LONG nPort, BOOL bIsChange, BOOL bNormalSpeed, long nStartFrameNum, long nStartStamp, long nFileHeader, void(CALLBACK *funGetOrignalFrame)(long nPort,FRAME_TYPE *frameType, long nUser), long nUser) 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="bIsChange">是否要改變每幀的參數</param>
        
/// <param name="bNormalSpeed">是否要以正常速度得到原始幀</param>
        
/// <param name="nStartFrameNum">如要改變原始幀幀號,則是此文件的開始幀號</param>
        
/// <param name="nStartStamp">如要改變原始幀時標,則是此文件的開始時標</param>
        
/// <param name="nFileHeader">輸出參數:文件頭版本信息,如果版本不匹配,返回不成功</param>
        
/// <param name="gof"></param>
        
/// <param name="nUser">用戶數據</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_GetOriginalFrameCallBack(int nPort, bool bIsChange, bool bNormalSpeed, int nStartFrameNum, int nStartStamp, out int nFileHeader, GetOrignalFrame gof, int nUser);


        
/// <summary>
        
/// 得到文件最後的時標和幀號,在文件打開之後調用。與上個文件一起使用,用於文件拼接。 
        
/// 
        
/// 90.BOOL _stdcall Hik_PlayM4_GetFileSpecialAttr(LONG nPort, DWORD *pTimeStamp,DWORD *pFileNum ,DWORD *nFileHeader) 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="pTimeStamp">文件結束時標</param>
        
/// <param name="pFileNum">文件結束幀號</param>
        
/// <param name="nFileHeader">文件頭信息</param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_GetFileSpecialAttr(int nPort, ref ushort pTimeStamp, ref ushort pFileNum, ref ushort nFileHeader);

        
#region 以下爲4.7版(build0711)新增接口

        
/// <summary>
        
/// 抓圖存爲JPEG文件, 該函數可在顯示回調函數中使用, 用法參見Hik_PlayM4_ConvertToBmpFile(); 
        
/// 
        
/// 91. BOOL _stdcall Hik_PlayM4_ConvertToJpegFile(char *pBuf, long nSize, long nWidth, int 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">圖像類型YV12</param>
        
/// <param name="sFileName">保存jpeg文件路徑 </param>
        
/// <returns>
        
///     TRUE: 保存Jpeg文件成功
        
///      FALSE: 失敗, 可調用Hik_PlayM4_GetLastError()獲取錯誤類型 
        
/// </returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_ConvertToJpegFile(byte[] pBuf, int nSize, int nWidth, int nHeight, int nType, string sFileName);

        
/// <summary>
        
/// 設置抓取的jpeg圖像質量, 設置範圍0~100, 建議使用75~90, 若不調用該函數, 則採用默認圖像質量, 目前默認爲80 
        
/// 
        
/// 92. BOOL _stdcall Hik_PlayM4_SetJpegQuality(long nQuality) 
        
/// </summary>
        
/// <param name="nQuality">
        
///     質量參數, 範圍0~100
        
///     0:   圖像質量最差, 但抓取的圖像大小最小 
        
///     100: 圖像質量最好, 但抓取的圖像大小最大 
        
/// </param>
        
/// <returns>
        
///     TRUE: 設置成功, 採用設置的質量
        
/// FALSE: 設置失敗, 採用默認值, 可調用Hik_PlayM4_GetLastError()獲取錯誤類型 
        
///     </returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetJpegQuality(int nQuality);

        
/// <summary>
        
/// 設置是否去閃爍功能, 原先在靜止圖像區域有噪聲情況下, 圖像會產生閃爍現象(或稱刷新或跳動),
        
/// 啓動去閃爍功能後,閃爍效果可消除或減輕,同時也能降低噪聲 
        
/// 
        
/// 93. BOOL _stdcall Hik_PlayM4_SetDeflash(LONG nPort,BOOL bDeflash) 
        
/// </summary>
        
/// <param name="nPort">通道號</param>
        
/// <param name="bDeflash"> TRUE表示設置去閃爍,FALSE表示不設置,默認爲不設置</param>
        
/// <returns>TRUE: 設置成功;FALSE: 設置失敗, 採用默認值, 可調用Hik_PlayM4_GetLastError()獲取錯誤類型 </returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetDeflash(int nPort, bool bDeflash);

        
#endregion

        
#region 以下爲4.8版(build0813)新增接口

        
/// <summary>
        
/// 幀號不連續時是否跳下一個I幀
        
/// 
        
/// 94. BOOL __stdcall Hik_PlayM4_CheckDiscontinuousFrameNum(LONG nPort, BOOL bCheck)
        
/// </summary>
        
/// <param name="nPort">通道號</param>
        
/// <param name="bCheck">幀號不連續時是否跳下一個I幀</param>
        
/// <returns>TRUE:  設置成功  FALSE: 設置失敗 </returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_CheckDiscontinuousFrameNum(int nPort, bool bCheck);

        
/// <summary>
        
/// 抓取bmp圖像 
        
/// 
        
/// 95. BOOL __stdcall Hik_PlayM4_GetBMP(LONG nPort,PBYTE pBitmap,DWORD nBufSize,DWORD* pBmpSize); 
        
/// </summary>
        
/// <param name="nPort">通道號</param>
        
/// <param name="pBitmap">
        
///     存放BMP圖像數據地址,由用戶分配,不得小於bmp圖像大小
        
///     sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + w * h * 4, 其中w和h分別爲圖像寬高。 
        
/// </param>
        
/// <param name="nBufSize">申請的緩衝區大小</param>
        
/// <param name="pBmpSize">獲取到的實際bmp圖像大小</param>
        
/// <returns>TRUE:  獲取成功 FALSE: 獲取失敗 </returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_GetBMP(int nPort, string pBitmap, ushort nBufSize, out ushort pBmpSize);

        
/// <summary>
        
/// 抓取jpeg圖像 
        
/// 
        
/// 96. BOOL __stdcall Hik_PlayM4_GetJPEG(LONG nPort,PBYTE pJpeg,DWORD nBufSize,DWORD* pJpegSize); 
        
/// </summary>
        
/// <param name="nPort">通道號</param>
        
/// <param name="pJpeg">存放JEPG圖像數據地址,由用戶分配,不得小於JPEG圖像大小,建議大小w * h * 3/2, 其中w和h分別爲圖像寬高。</param>
        
/// <param name="nBufSize">申請的緩衝區大小。</param>
        
/// <param name="pJpegSize">獲取到的實際bmp圖像大小。</param>
        
/// <returns>TRUE:   獲取成功  FALSE:  獲取失敗</returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_GetJPEG(int nPort, string pJpeg, ushort nBufSize, out ushort pJpegSize);

        
/// <summary>
        
///  設置回調函數,替換播放器中的顯示部分,有用戶自己控制顯示,該函數在Hik_PlayM4_Play之前調用,
        
///  在Hik_PlayM4_Stop時自動失效,下次調用Hik_PlayM4_Play之前需要重新設置。
        
///  注意解碼部分不控制速度,只要用戶從回調函數中返回,解碼器就會解碼下一部分數據。這個功能
        
///  的使用需要用戶對視頻顯示和聲音播放有足夠的瞭解,否則請慎重使用,有關知識請參閱directx開發包。
        
/// 
        
/// 97. BOOL __stdcall Hik_PlayM4_SetDecCallBackMend(LONG nPort,void (CALLBACK* DecCBFun)(long nPort,char * pBuf,long nSize,FRAME_INFO * pFrameInfo, long nUser, long nReserved2), long nUser); 
        
/// </summary>
        
/// <param name="nPort"></param>
        
/// <param name="dcbf">DecCBFun回調函數指針,不能爲NULL</param>
        
/// <param name="nUser"></param>
        
/// <returns></returns>
        [DllImport("HikPlayM4.dll")]
        
public static extern bool Hik_PlayM4_SetDecCallBackMend(int nPort, DecCBFun dcbf, int nUser);


        
#endregion

    }
}

複製代碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章