正文
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
}
}
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
}
}