前言
寫系列文章的時候[前言]部分變得無言了,可能來得順利了點吧: ) 本章中提供的封裝均是我用笨辦法從<<Hikvision 板卡網絡開發包編程手冊V4.7>>和<<DS-4000HC、HCS、HC+、HF、HS、MD卡的Windows編程指南V4.3>>中拷貝出來並參照VC++代碼進行整理的,主要是針對HikServer.dll和DS40xxSDK.dll的調用封裝。
注意
本系列文章限於學習交流,注重過程,由於涉及公司,所以不提供源代碼下載,非常抱歉!!但是請大家放心,核心、實現以及其他能夠貼出來的代碼我都會貼出來,並且爭取盡所能的回答留言裏的每一個問題,感謝大家關注,歡迎交流 :)
系列
5. C# 視頻監控系列(5):客戶端——給服務器端發送字符串和錄像(數據捕獲)
6. C# 視頻監控系列(6):服務器端——封裝API(上) [HikServer.dll]
7. C# 視頻監控系列(7):服務器端——封裝API(下) [DS40xxSDK.dll]
正文
1. DS40xxSDK.dll
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
namespace HikServer.DS40xxSDK
{
#region enum
/// <summary>
/// 板卡類型
/// </summary>
public enum BOARD_TYPE_DS : uint
{
DS400XM = 0, //M卡
DS400XH = 1, //H卡
DS4004HC = 2, //4004HC
DS4008HC = 3, //4008HC
DS4016HC = 4, //4016HC
DS4001HF = 5, //4001HF
DS4004HF = 6, //4004HF
DS4002MD = 7, //4002MD
DS4004MD = 8, //4004MD
DS4016HCS = 9, //4016HCS
DS4002HT = 10, //4002HT
DS4004HT = 11, //4004HT
DS4008HT = 12, //4008HT
DS4004HC_PLUS = 13, //4004HC+
DS4008HC_PLUS = 14, //4008HC+
DS4016HC_PLUS = 15, //4016HC+
DS4008HF = 16, //4008HF
DS4008MD = 17, //4008MD
DS4008HS = 18, //4008HS
DS4016HS = 19, //4016HS
INVALID_BOARD_TYPE = 0xffffffff,
}
/// <summary>
/// 視頻預覽格式
/// </summary>
public enum TypeVideoFormat
{
vdfRGB8A_233 = 0x00000001,
vdfRGB8R_332 = 0x00000002,
vdfRGB15Alpha = 0x00000004,
/// <summary>
/// 16位RGB視頻壓縮格式
/// </summary>
vdfRGB16 = 0x00000008,
/// <summary>
/// 24位RGB視頻壓縮格式
/// </summary>
vdfRGB24 = 0x00000010,
vdfRGB24Alpha = 0x00000020,
vdfYUV420Planar = 0x00000040,
/// <summary>
/// YUV422視頻壓縮格式
/// </summary>
vdfYUV422Planar = 0x00000080,
vdfYUV411Planar = 0x00000100,
vdfYUV420Interspersed = 0x00000200,
vdfYUV422Interspersed = 0x00000400,
vdfYUV411Interspersed = 0x00000800,
vdfYUV422Sequence = 0x00001000, /* U0, Y0, V0, Y1: For VO overlay */
vdfYUV422SequenceAlpha = 0x00002000,
/* U0, Y0, V0, Y1: For VO overlay, with low bit for alpha blending */
vdfMono = 0x00004000, /* 8 bit monochrome */
vdfYUV444Planar = 0x00008000,
};
/// <summary>
/// 視頻制式
/// </summary>
public enum VideoStandard_t : uint
{
/// <summary>
/// 無視頻信號
/// </summary>
StandardNone = 0x80000000,
/// <summary>
/// NTSC制式
/// </summary>
StandardNTSC = 0x00000001,
/// <summary>
/// PAL制式
/// </summary>
StandardPAL = 0x00000002,
StandardSECAM = 0x00000004,
} ;
/// <summary>
/// 編碼圖像分辨率
/// </summary>
public enum PictureFormat_t
{
ENC_CIF_FORMAT = 0,
ENC_QCIF_FORMAT = 1,
ENC_2CIF_FORMAT = 2,
ENC_4CIF_FORMAT = 3,
ENC_QQCIF_FORMAT = 4,
ENC_CIFQCIF_FORMAT = 5,
ENC_CIFQQCIF_FORMAT = 6,
ENC_DCIF_FORMAT = 7
};
/// <summary>
/// 碼流控制方式
/// </summary>
public enum BitrateControlType_t
{
/// <summary>
/// 變碼率
/// </summary>
brCBR = 0,
/// <summary>
/// 恆定碼率
/// </summary>
brVBR = 1,
};
public enum FrameType_t
{
PktError = 0,
PktIFrames = 0x0001,
PktPFrames = 0x0002,
PktBBPFrames = 0x0004,
PktAudioFrames = 0x0008,
PktMotionDetection = 0x00010,
PktDspStatus = 0x00020,
PktOrigImage = 0x00040,
PktSysHeader = 0x00080,
PktBPFrames = 0x00100,
PktSFrames = 0x00200,
PktSubIFrames = 0x00400,
PktSubPFrames = 0x00800,
PktSubBBPFrames = 0x01000,
PktSubSysHeader = 0x02000
};
#endregion
#region struct
/// <summary>
/// 板卡信息結構體
/// </summary>
public struct DS_BOARD_DETAIL
{
/// <summary>
/// 板卡類型
/// </summary>
BOARD_TYPE_DS type;
/// <summary>
/// 序列號
/// BYTE sn[16];
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
byte[] sn;
/// <summary>
/// 板卡包含的DSP個數
/// </summary>
uint dspCount;
/// <summary>
/// 板卡上第一個DSP的索引
/// </summary>
uint firstDspIndex;
/// <summary>
/// 板卡包含的編碼通道個數
/// </summary>
uint encodeChannelCount;
/// <summary>
/// 板卡上第一個編碼通道的索引
/// </summary>
uint firstEncodeChannelIndex;
/// <summary>
/// 板卡包含的解碼通道個數
/// </summary>
uint decodeChannelCount;
/// <summary>
/// 板卡上第一個解碼通道的索引
/// </summary>
uint firstDecodeChannelIndex;
/// <summary>
/// 板卡包含的視頻輸出通道個數
/// </summary>
uint displayChannelCount;
/// <summary>
/// 板卡上第一個視頻輸出通道的索引
/// </summary>
uint firstDisplayChannelIndex;
uint reserved1;
uint reserved2;
uint reserved3;
/// <summary>
/// 硬件版本,format:major.minor.build,major:bit 16-19,minor: bit 8-15,build: bit 0-7
/// </summary>
uint version;
}
/// <summary>
/// DSP信息結構體
/// </summary>
public struct DSP_DETAIL
{
/// <summary>
/// 此DSP所包含的編碼通道個數
/// </summary>
uint encodeChannelCount;
/// <summary>
/// 此DSP上第一個編碼通道在所有編碼通道中的索引
/// </summary>
uint firstEncodeChannelIndex;
/// <summary>
/// 此DSP所包含的解碼通道個數
/// </summary>
uint decodeChannelCount;
/// <summary>
/// 此DSP上第一個解碼通道在所有解碼通道中的索引
/// </summary>
uint firstDecodeChannelIndex;
/// <summary>
/// 此DSP包含的顯示通道個數
/// </summary>
uint displayChannelCount;
/// <summary>
/// 此DSP上第一個顯示通道在所有顯示通道中的索引
/// </summary>
uint firstDisplayChannelIndex;
uint reserved1;
uint reserved2;
uint reserved3;
uint reserved4;
}
/// <summary>
/// 特殊功能結構體
/// </summary>
public struct CHANNEL_CAPABILITY
{
/// <summary>
/// 音頻預覽
/// </summary>
byte[] bAudioPreview;
/// <summary>
/// 報警信號
/// </summary>
byte[] bAlarmIO;
/// <summary>
/// 看家狗
/// </summary>
byte[] bWatchDog;
}
/// <summary>
/// 版本信息
/// </summary>
public struct PVERSION_INFO
{
/// <summary>
/// DSP版本號,DSP的BUILD號,用於軟件升級時標明該版本的最後修改時間
/// </summary>
ulong DspVersion, DspBuildNum;
/// <summary>
/// Driver版本號,Driver的BUILD號,用於軟件升級時標明該版本的最後修改時間
/// </summary>
ulong DriverVersion, DriverBuildNum;
/// <summary>
/// SDK版本號,SDK的BUILD號,用於軟件升級時標明該版本的最後修改時間
/// </summary>
ulong SDKVersion, SDKBuildNum;
}
/// <summary>
/// 顯示窗口內的矩形區域
/// </summary>
//[StructLayout(LayoutKind.
//public struct RECT
//{
// public long left;
// public long top;
// public long right;
// public long bottom;
//}
/// <summary>
/// 幀統計信息結構體
/// </summary>
public struct PFRAMES_STATISTICS
{
/// <summary>
/// 視頻幀
/// </summary>
ulong VideoFrames;
/// <summary>
/// 音頻幀
/// </summary>
ulong AudioFrames;
/// <summary>
/// 丟失幀
/// </summary>
ulong FramesLost;
/// <summary>
/// 丟失的碼流(字節)
/// </summary>
ulong QueueOverflow;
/// <summary>
/// 當前的幀率(bps)
/// </summary>
ulong CurBps;
}
/// <summary>
/// 版本信息結構體
/// </summary>
public struct PHW_VERSION
{
/// <summary>
/// DSP程序的版本號和Build號
/// </summary>
ulong DspVersion, DspBuildNum;
/// <summary>
/// 驅動程序的版本號和Build號
/// </summary>
ulong DriverVersion, DriverBuildNum;
/// <summary>
/// SDK 的版本號和Build號
/// </summary>
ulong SDKVersion, SDKBuildNum;
}
/// <summary>
/// 系統時間
/// </summary>
public struct SYSTEMTIME
{
ushort wYear;
ushort wMonth;
ushort wDayOfWeek;
ushort wDay;
ushort wHour;
ushort wMinute;
ushort wSecond;
ushort wMilliseconds;
}
#endregion
#region delegate
/// <summary>
/// 原始圖像流設置
///
/// typedef void (*IMAGE_STREAM_CALLBACK)(UINT channelNumber,void *context);
/// </summary>
/// <param name="channelNumber">通道號</param>
/// <param name="context">設備上下文</param>
public delegate void IMAGE_STREAM_CALLBACK(uint channelNumber, IntPtr context);
/// <summary>
/// 編碼數據流直接讀取回調函數
///
/// typedef int (*STREAM_DIRECT_READ_CALLBACK)(ULONG channelNumber,void *DataBuf,DWORD Length,int FrameType,void *context);
/// </summary>
/// <param name="channelNumber">通道號</param>
/// <param name="DataBuf">緩衝區地址</param>
/// <param name="Length">緩衝區長度</param>
/// <param name="FrameType">緩衝區數據幀類型</param>
/// <param name="context">設備上下文</param>
/// <returns></returns>
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
//public delegate int STREAM_DIRECT_READ_CALLBACK(uint channelNumber, byte[] DataBuf, uint Length, FrameType_t FrameType, IntPtr context);
public delegate int STREAM_DIRECT_READ_CALLBACK(int channelNumber, IntPtr DataBuf, int Length, FrameType_t FrameType, IntPtr context);
//public unsafe delegate int STREAM_DIRECT_READ_CALLBACK(uint channelNumber, void * DataBuf, uint Length, int FrameType, IntPtr context);
/// <summary>
/// 直接讀取碼流回調函數
///
/// typedef int (*STREAM_READ_CALLBACK)(ULONG channelNumber, void *context)
/// </summary>
/// <param name="channelNumber">通道號</param>
/// <param name="context">設備上下文</param>
/// <returns></returns>
public delegate int STREAM_READ_CALLBACK(ulong channelNumber, IntPtr context);
/// <summary>
/// 移動偵測結果回調函數
///
/// typedef void (*MOTION_DETECTION_CALLBACK)(ULONG channelNumber, BOOL bMotionDetected,void *context)
/// </summary>
/// <param name="channelNumber">通道號</param>
/// <param name="bMotionDetected">
/// 移動偵測發生標誌,如果當前通道所設置的移動偵測
/// 區域內產生了移動偵測,則被置爲True;如果當前通道所設置的移動偵測區域內自上
/// 一次產生移動偵測後delay秒內沒有發生移動偵測,則被置爲False。
/// </param>
/// <param name="context">設備上下文</param>
public delegate void MOTION_DETECTION_CALLBACK(ulong channelNumber, bool bMotionDetected, IntPtr context);
/// <summary>
/// 畫圖回調函數
///
/// #define DRAWFUN(x) void (CALLBACK* x)(long nPort,HDC hDc,LONG nUser)
/// </summary>
/// <param name="nPort">通道號</param>
/// <param name="HDC">offscreen表面設備上下文,相當於顯示窗口中的DC</param>
/// <param name="nUser">用戶數據</param>
public delegate void DrawFun(long nPort, IntPtr HDC, long nUser);
/// <summary>
/// 解碼回調函數
///
/// typedef void (*DECODER_VIDEO_CAPTURE_CALLBACK)(UINT nChannelNumber, void *DataBuf,UINT width,UINT height,UINT nFrameNum,UINT nFrameTime, SYSTEMTIME *pFrameAbsoluteTime,void *context)
/// </summary>
/// <param name="nChannelNumber">解碼通道句柄</param>
/// <param name="DataBuf">緩衝區地址</param>
/// <param name="width">圖像寬度</param>
/// <param name="height">圖像高度</param>
/// <param name="nFrameNum">捕獲的當前幀的序號</param>
/// <param name="nFrameTime">捕獲的當前幀的相對時間,單位:毫秒</param>
/// <param name="pFrameAbsoluteTime">捕獲的當前幀的絕對時間</param>
/// <param name="context">設備上下文</param>
public delegate void DECODER_VIDEO_CAPTURE_CALLBACK(uint nChannelNumber, IntPtr DataBuf, uint width, uint height, uint nFrameNum, uint nFrameTime, SYSTEMTIME pFrameAbsoluteTime, IntPtr context);
/// <summary>
/// 創建索引完成回調函數
///
/// typedef void (*FILE_REF_DONE_CALLBACK)(UINT nChannel,UINT nSize)
/// </summary>
/// <param name="nChannel">通道號</param>
/// <param name="nSize">索引大小(暫時無效,以後可以增加索引導出、導入功能) </param>
public delegate void FILE_REF_DONE_CALLBACK(uint nChannel, uint nSize);
#endregion
/// <summary>
/// DS40xxSDK.dll
/// </summary>
public class HikVisionSDK
{
/// <summary>
/// 狀態
/// </summary>
public static readonly List<string> state = new List<string>(new string[]{
"", "正在打開", "音頻信號丟失", "視頻信號丟失", "有物體移動", //0-4
"自動分割錄像", "開始錄像", "停止錄像", "啓動聲音監聽", "停止聲音監聽", //5-9
"啓動視頻預覽", "停止視頻預覽", "啓動錄像", "停止錄像", "啓動視頻報警", //10-14
"關閉視頻報警", "啓動音頻報警", "停止音頻報警", "啓動移動偵測", "停止移動偵測", //15-19
"啓動視頻遮擋", "關閉視頻遮擋", "開始屏幕輸出", "停止屏幕輸出", "啓動視頻LOGO", //20-24
"停止視頻LOGO", "開始視頻OSD", "停止視頻OSD", "切換爲黑白視頻", "切換爲彩色視頻", //25-29
"切換爲黑屏顯示", "切換爲白屏顯示", "視頻色彩復位", "啓動全屏顯示", "採集卡已經加載", //30-34
"採集卡已經卸截", "視頻服務啓動成功", "視頻服務已停止", "靜音", "音量恢復", //35-39
"雲臺控制命令發送", "系統出現未知錯誤", "錄像文件大小", "配置端口號成功", "連接服務端成功", //40-44
"正在連接", "開始接收圖象", "異常退出", "接收完畢,退出", "無法聯繫服務端", //45-49
"服務端拒絕訪問", "無效", "停止客戶端連接", "圖像抓取成功", "初始化服務端網絡連接成功", //50-54
"視頻服務啓動失敗", "退出全屏預覽", "", "", "" //55-59
});
//可以用新版函數替代功能或者無效的API
//GetTotalChannels:可用GetEncodeChannelCount替代
//GetTotalDSPs:可用GetDspCount 替代
//SetupDateTime:4.0版本起無效
//HW_GetChannelNum:無效,請使用GetBoardDetail
//HW_GetDeviceSerialNo:無效,請使用GetBoardDetail
//HW_SetVideoOutStandard:無效,請使用SetDisplayStandard或SetDefaultVideoStandard
//HW_SetDspDeadlockMsg:無效
//HW_ResetDsp:無效
//HW_SetDisplayPara:DISPLAY_PARA結構中bToVideoOut無效,MD卡模擬視頻輸出功能
//已經整合到視頻矩陣之中。
#region 流類型宏定義
/// <summary>
/// 視頻流
/// #define STREAM_TYPE_VIDEO
/// </summary>
private const int STREAM_TYPE_VIDEO = 1;
/// <summary>
/// 音頻流
/// #define STREAM_TYPE_AUDIO
/// </summary>
private const int STREAM_TYPE_AUDIO = 2;
/// <summary>
/// 音視頻複合流
/// #define STREAM_TYPE_AVSYNC
/// </summary>
private const int STREAM_TYPE_AVSYNC = 3;
#endregion
#region 1.板卡初始化及卸載
/// <summary>
/// 1.1初始化DSP InitDSPs
/// 說 明: 初始化系統中每一塊板卡,應在應用軟件程序啓動時完成。如果返回值爲0則表
/// 明初始化失敗,可能沒有找到相應的DSP軟件模塊。
///
/// int __stdcall InitDSPs()
/// </summary>
/// <returns>系統內可用的編碼通道個數。 </returns>
[DllImport("DS40xxSDK.dll")]
public static extern int InitDSPs();
/// <summary>
/// 1.2卸載DSP DeInitDSPs
/// 說 明: 關閉每一塊板卡上的功能,應在應用軟件程序退出時調用。
///
/// int __stdcall DeInitDSPs()
/// </summary>
/// <returns>0</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int DeInitDSPs();
#endregion
#region 2.板卡信息獲取
/// <summary>
/// 2.1獲取系統中板卡的張數GetBoardCount
/// 說 明: 獲取系統中所有板卡的張數,包含編碼卡和解碼卡。
///
/// unsigned int __stdcall GetBoardCount()
/// </summary>
/// <returns>系統中板卡的總張數。</returns>
[DllImport("DS40xxSDK.dll")]
public static extern uint GetBoardCount();
/// <summary>
/// 2.2獲取系統中DSP的個數GetDspCount
/// 說 明: 獲取系統中所有板卡的DSP的個數。
///
/// unsigned int __stdcall GetDspCount()
/// </summary>
/// <returns>系統中DSP的總個數</returns>
[DllImport("DS40xxSDK.dll")]
public static extern uint GetDspCount();
/// <summary>
/// GetTotalDSPs:可用GetDspCount 替代
/// 獲得實際可用DSP
/// </summary>
/// <returns></returns>
[DllImport("DS40xxSDK.dll")]
public static extern int GetTotalDSPs();
/// <summary>
/// 2.3獲取系統中編碼通道的個數GetEncodeChannelCount
/// 說 明: 獲取系統中所有編碼卡的編碼通道總個數,包含H系列和HC系列編碼卡。
///
/// unsigned int __stdcall GetEncodeChannelCount()
/// </summary>
/// <returns>系統中編碼通道的個數</returns>
[DllImport("DS40xxSDK.dll")]
public static extern uint GetEncodeChannelCount();
/// <summary>
/// 2.4獲取系統中解碼通道的個數GetDecodeChannelCount
/// 說 明: 獲取系統中MD卡的解碼通道個數
///
/// unsigned int __stdcall GetDecodeChannelCount()
/// </summary>
/// <returns></returns>
[DllImport("DS40xxSDK.dll")]
public static extern uint GetDecodeChannelCount();
/// <summary>
/// 2.5獲取系統中解碼顯示通道的個數GetDisplayChannelCount
/// 說 明: 獲取系統中MD卡顯示通道的個數,即模擬視頻輸出通道的個數
///
/// unsigned int __stdcall GetDisplayChannelCount()
/// </summary>
/// <returns>系統中顯示通道的個數</returns>
[DllImport("DS40xxSDK.dll")]
public static extern uint GetDisplayChannelCount();
/// <summary>
/// 2.6獲取板卡詳細信息GetBoardDetail
/// 說 明: 獲取某張板卡的詳細信息
///
/// int __stdcall GetBoardDetail(UINT boardNum,DS_BOARD_DETAIL *pBoardDetail)
/// </summary>
/// <param name="boardNum">板卡索引</param>
/// <param name="pBoardDetail">板卡信息</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int GetBoardDetail(uint boardNum, ref DS_BOARD_DETAIL pBoardDetail);
/// <summary>
/// 2.7獲取DSP詳細信息GetDspDetail
/// 說 明: 獲取某個DSP的詳細信息
///
/// int __stdcall GetDspDetail(UINT dspNum,DSP_DETAIL *pDspDetail)
/// </summary>
/// <param name="dspNum">DSP索引</param>
/// <param name="pDspDetail">DSP信息</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int GetDspDetail(uint dspNum, ref DSP_DETAIL pDspDetail);
/// <summary>
/// 2.8獲取板卡型號及序列號信息GetBoardInfo
/// 說 明: 獲取板卡的型號及序列號信息
///
/// int __stdcall GetBoardInfo(HANDLE hChannelHandle, ULONG *BoardType, UCHAR *SerialNo)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="BoardType">板卡型號</param>
/// <param name="SerialNo">
/// 板卡ID號, 內容爲板卡序列號的ASCII的數值,次序爲SerialNo[0] 對應最高位,
/// SerialNo[11]對應最低位。比如卡號爲“40000002345”的值對應爲 4,0,0,0,0,1,0,0,2,3,4,5 的整形數組。
/// </param>
/// <returns>成功爲0;失敗返回錯誤號 </returns>
[DllImport("DS40xxSDK.dll")]
public static extern int GetBoardInfo(IntPtr hChannelHandle, ulong BoardType, byte[] SerialNo);
/// <summary>
/// 2.9獲取板卡特殊功能信息GetCapability
/// 說 明: 獲取板卡特殊功能信息
///
/// int __stdcall GetCapability(HANDLE hChannelHandle, CHANNEL_CAPABILITY *Capability)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="Capability">特殊功能 </param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int GetCapability(IntPtr hChannelHandle, CHANNEL_CAPABILITY Capability);
/// <summary>
/// 2.10獲取板卡SDK信息GetSDKVersion
/// 說 明: 獲取當前所使用的DSP、Driver、SDK版本號
///
/// int __stdcall GetSDKVersion(PVERSION_INFO VersionInfo)
/// </summary>
/// <param name="VersionInfo">版本信息</param>
/// <returns>成功返回0;失敗返回錯誤號。</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int GetSDKVersion(ref PVERSION_INFO VersionInfo);
/// <summary>
/// 2.11獲取板卡SDK及DSP錯誤報告GetLastErrorNum*,此函數只對H卡有效
/// 說 明: 獲取SDK及DSP錯誤報告。此函數只對H卡有效,用於HC卡上返回0且無效
///
/// int __stdcall GetLastErrorNum(HANDLE hChannelHandle, ULONG *DspError, ULONG *SdkError)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="DspError">DSP錯誤</param>
/// <param name="SdkError">SDK錯誤</param>
/// <returns>DSP錯誤信息、SDK錯誤信息</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int GetLastErrorNum(IntPtr hChannelHandle, ref int DspError, ref int SdkError);
#endregion
#region 3.編碼卡API
#region 3.1通道打開及關閉
/// <summary>
/// 3.1.1打開通道ChannelOpen
/// 說 明: 打開通道,獲取編碼通道的操作句柄,與通道相關的操作需使用相對應的句柄。
///
/// HANDLE __stdcall ChannelOpen(int ChannelNum)
/// </summary>
/// <param name="ChannelNum">通道號(從0開始)</param>
/// <returns>成功返回有效句柄(值可能爲0);失敗返回0xFFFFFFFF。</returns>
[DllImport("DS40xxSDK.dll")]
public static extern IntPtr ChannelOpen(int ChannelNum);
/// <summary>
/// 3.1.2關閉通道ChannelClose
/// 說 明: 關閉通道,釋放相關資源
///
/// int __stdcall ChannelClose(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int ChannelClose(IntPtr hChannelHandle);
#endregion
#region 3.2視頻預覽
#region 3.2.1 Overlay預覽模式
// 釋 義: overlay預覽模式
//Overlay通常被稱爲重疊頁面或者是覆蓋層,是一種需要特定的硬件支持的頁面,通常
//被用於顯示實時視頻於主頁面之上,而不需要Blit操作到主頁面或用任何方法改變主頁面的
//內容。使用該方式進行預覽可以提高預覽的畫質和降低CPU利用率。
/// <summary>
/// 3.2.1.1設置視頻預覽模式SetPreviewOverlayMode
/// 說 明: SDK自3.2版本起在部分顯卡中實現了HC卡以overlay方式預覽的功能(此功
/// 能不支持與H卡混插的狀態下),可以提高預覽的畫質和降低CPU利用率。當預覽畫面小
/// 於704*576時,需要調用該函數來啓動overlay模式,如不設置則自動切換到offscreen模式
/// 進行預覽顯示,當預覽畫面大於704*576時,SDK自動切換到overlay模式
///
/// int __stdcall SetPreviewOverlayMode(BOOL bTrue)
/// </summary>
/// <param name="bTrue">是否設置overlay預覽方式,也適用於MD卡</param>
/// <returns>0表示顯卡支持板卡的overlay預覽方式;其他值表示顯卡不支持 </returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetPreviewOverlayMode(bool bTrue);
/// <summary>
/// 3.2.1.2設置overlay關鍵色SetOverlayColorKey
/// 注意:需要在StartVideoPreview前調用該函數。
/// 說 明: 板卡在顯示範圍小於704*576時,調用SetPreviewOverlayMode可以開啓overlay
/// 預覽模式,需調用SetOverlayColorKey設置overlay關鍵色;當顯示範圍大於704*576時,
/// 板卡自動切換到overlay預覽模式,關鍵色默認設置爲RGB(10,10,10),也可調用
/// SetOverlayColorKey修改關鍵色。在這兩種情況下,都需要將顯示窗口的底色設置爲和關鍵
/// 色相一致。否則圖像將難以顯示。
///
///
/// int __stdcall SetOverlayColorKey(COLORREF DestColorKey)
/// </summary>
/// <param name="DestColorKey">overlay關鍵色參數(RGB(*,*,*))</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetOverlayColorKey(int DestColorKey);
//public static extern int SetOverlayColorKey(Color DestColorKey);
/// <summary>
/// 3.2.1.3恢復當前丟失的表面RestoreOverlay
/// 說 明: 恢復當前丟失的表面,例如:當系統按下CTRL+ALT+DEL時系統的OVERLAY
/// 表面會被強制關閉,調用該函數可以恢復OVERLAY表面
///
/// int __stdcall RestoreOverlay()
/// </summary>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int RestoreOverlay();
#endregion
#region 3.2.2 開啓及停止視頻預覽
/// <summary>
/// 3.2.2.1開啓視頻預覽StartVideoPreview
/// 說 明: 啓動視頻預覽,調用SetPreviewOverlayMode後,可進行overlay模式預覽,否則,
/// 將默認採用offscreen模式預覽。當畫面大於704*576時,SDK自動切換到overlay預覽模式。
///
/// int __stdcall StartVideoPreview(HANDLE hChannelHandle,HWND WndHandle, RECT *rect,BOOLEAN bOverlay, int VideoFormat, int FrameRate)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="WndHandle">顯示窗口句柄</param>
/// <param name="rect">
/// 顯示窗口內的矩形區域
/// Rect.right 必須爲8的倍數
/// Rect.bottom必須爲16的倍數
/// </param>
/// <param name="bOverlay">是否啓用Overlay預覽模式</param>
/// <param name="VideoFormat">視頻預覽格式(目前無效)</param>
/// <param name="FrameRate">視頻預覽幀率(PAL:1-25,NTSC:1-30)</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int StartVideoPreview(IntPtr hChannelHandle, IntPtr WndHandle, ref Rectangle rect, bool bOverlay, int VideoFormat, int FrameRate);
//public static extern int StartVideoPreview(IntPtr hChannelHandle, IntPtr WndHandle, ref RECT rect, bool bOverlay, int VideoFormat, int FrameRate);
/// <summary>
/// 3.2.2.2停止視頻預覽StopVideoPreview
/// 說 明: 停止視頻預覽
///
/// int __stdcall StopVideoPreview(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int StopVideoPreview(IntPtr hChannelHandle);
#endregion
#region 3.2.3 視頻參數的設置及獲取
/// <summary>
/// 3.2.3.1設置視頻參數SetVideoPara
/// 說 明: 設置視頻參數
///
/// int __stdcall SetVideoPara(HANDLE hChannelHandle, int Brightness, int Contrast, int Saturation, int Hue)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="Brightness">亮度值(0-255)</param>
/// <param name="Contrast">對比度(0-127)</param>
/// <param name="Saturation">飽和度(0-127)</param>
/// <param name="Hue">色調(0-255)</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetVideoPara(IntPtr hChannelHandle, int Brightness, int Contrast, int Saturation, int Hue);
/// <summary>
/// 3.2.3.2獲取視頻參數GetVideoPara
/// 說 明: 獲取視頻參數
///
/// int __stdcall GetVideoPara(HANDLE hChannelHandle, VideoStandard_t *VideoStandard, int*Brightness, int *Contrast, int *Saturation, int *Hue)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="VideoStandard">視頻制式</param>
/// <param name="Brightness">亮度指針值(0-255)</param>
/// <param name="Contrast">對比度指針值(0-127)</param>
/// <param name="Saturation">飽和度指針值(0-127)</param>
/// <param name="Hue">色調指針值(0-255)</param>
/// <returns> 成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int GetVideoPara(IntPtr hChannelHandle, VideoStandard_t VideoStandard, out int Brightness, out int Contrast, out int Saturation, out int Hue);
#endregion
#endregion
#region 3.3視頻信號設置(制式、狀況、輸入位置等)
/// <summary>
/// 3.3.1設置視頻制式SetVideoStandard,此函數只對H卡有效
/// 說 明: 設置視頻制式,在某一制式的攝像頭已經接好的情況下啓動系統時可不必調用該
/// 函數,如果沒有接攝像頭的情況下啓動系統然後再接NTSC制式的攝像頭則必須調用該函
/// 數,或者中途調換不同制式的攝像頭也必須調用該函數。
///
/// int __stdcall SetVideoStandard(HANDLE hChannelHandle, VideoStandard_t VideoStandard)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="VideoStandard">視頻制式</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetVideoStandard(IntPtr hChannelHandle, VideoStandard_t VideoStandard);
/// <summary>
/// 3.3.2設置系統默認的視頻制式SetDefaultVideoStandard
/// 注意:該函數只能在系統初始化(InitDSPs)之前運行,否則無效
/// 說 明: 設置系統默認的視頻制式,系統中所有的視頻輸入通道如果無視頻輸入或者在系
/// 統啓動的時候,通道會按照所設置的系統默認視頻制式進行處理。
///
/// int __stdcall SetDefaultVideoStandard(VideoStandard_t VideoStandard)
/// </summary>
/// <param name="VideoStandard">視頻制式,默認爲PAL </param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetDefaultVideoStandard(VideoStandard_t VideoStandard);
/// <summary>
/// 3.3.3設置視頻信號靈敏度SetVideoDetectPrecision
/// 說 明: 設置視頻信號檢測的靈敏度。如果視頻信號的強度比較弱,或者信號通斷的切換
/// 比較頻繁,會出現“無視頻信號”的提示字樣,爲了避免提示字樣影響圖像,可以更改視頻
/// 信號檢測的靈敏度。靈敏度取值越大,檢測精度越低,出現“無視頻信號”提示字樣的頻率
/// 越低。當將value值設置爲0xffffffff時,將不會再出現“無視頻信號”的提示字樣。
///
/// int __stdcall SetVideoDetectPrecision(HANDLE hChannel,unsigned int value)
/// </summary>
/// <param name="hChannel">通道句柄</param>
/// <param name="value">靈敏度。取值範圍:0-100,默認爲20</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetVideoDetectPrecision(IntPtr hChannel, uint value);
/// <summary>
/// 3.3.4獲取視頻信號輸入情況GetVideoSignal
/// 說 明: 獲取視頻信號的輸入情況,用於視頻丟失報警
///
/// int __stdcall GetVideoSignal(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <returns>信號正常返回0;返回其他值說明信號異常或有錯誤</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int GetVideoSignal(IntPtr hChannelHandle);
/// <summary>
/// 3.3.5調整視頻信號輸入位置SetInputVideoPosition
/// 說 明: 設置視頻信號的輸入位置。(x,y)爲系統處理圖像的左上角在攝像機輸入的原
/// 始圖像中的座標,某些攝像機輸入的圖像在預覽時可能在左邊會有黑邊,可以通過此函數進
/// 行調節,x必須設置爲2的整數倍。(x,y)的取值和攝像機的型號有關,如果指定的值和
/// 攝像機的輸入參數不匹配,可能會導致圖像靜止、水平垂直方向滾動或者黑屏,請謹慎使用。
///
/// int __stdcall SetInputVideoPosition(HANDLE hChannel,UINT x,UINT y)
/// </summary>
/// <param name="hChannel">通道句柄</param>
/// <param name="x">X軸座標,默認值爲8</param>
/// <param name="y">Y軸座標,默認值爲2</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetInputVideoPosition(IntPtr hChannel, uint x, uint y);
/// <summary>
/// 3.3.6設置反隔行變換及強度SetDeInterlace
/// 說 明: 設置是否採用反隔行算法,已經採用反隔行時的強度
///
/// 釋 義: 反隔行變換
/// 如果該通道的圖像需要進行4CIF的預覽或編碼,此時的圖像中會同時包含奇、偶兩
/// 場的數據,由於奇場圖像和偶場圖像不同步,導致圖像中運動的部分發生錯位、邊緣模糊,
/// 此時需要對圖像進行反隔行變換來去掉這種現象。如果用戶能夠確定使用的是逐行掃描格式
/// 的攝像機,或者主要應用在靜止場景,此時可以關掉反隔行變換功能,或者降低強度,這樣
/// 可以提高系統運行效率,並降低反隔行變換對圖像質量帶來的損失。
///
/// int __stdcall SetDeInterlace(HANDLE hChannelHandle,UINT mode,UINT level)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="mode">
/// 0表示該通道不進行反隔行變換,此時level參數無效;
/// 1表示使用舊的算法;
/// 2表示使用默認算法(系統默認值)。
/// </param>
/// <param name="level">
/// mode=1時有效,其它時無效。
/// 0-10,反隔行變換的強度逐漸加強,0最弱,對圖像的損失最小,10最強,對圖像的損失最大。
/// </param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetDeInterlace(IntPtr hChannelHandle, uint mode, uint level);
#endregion
#region 3.4視頻編碼參數設置
// 釋 義: 雙編碼功能(主、子通道)
// 對一路視頻圖像進行兩路視頻編碼,兩路視頻可以有不同的碼流類型、不同分辨率、不
//同碼率等。3.0版本對雙編碼功能做了增強,子通道的所有參數都可以任意設置。
//雙編碼中主通道和子通道唯一的區別在於:子通道佔用的系統資源比主通道少,優先級
//比主通道低。當系統忙時,會盡量保證主通道編碼,並先從子通道開始丟幀。由於佔用資源
//少,因此可以利用子通道來實現多路高分辨率的非實時編碼。例如:可以把DS-4000HC中
//的每個子通道全部設置爲4CIF分辨率(SetSubStreamType),而不使用主通道編碼,這樣就
//可以實現全部通道的4CIF編碼。在一般場景下,每路圖像都可以達到15幀以上。
/// <summary>
/// 3.4.1主、子通道切換SetupSubChannel
/// 說 明: 配合雙編碼模式使用。當設置某個通道爲雙編碼模式時,如主通道編碼CIF,子
/// 通道編碼QCIF,這時可對主/子通道分別設置某些參數。關鍵幀間隔、OSD、LOGO等參數
/// 對主/子通道是一樣的;在設置幀率、量化係數、變碼流/定碼流模式、碼流大小等參數時應
/// 調用此函數分別對主/子通道進行設置,缺省是對主通道進行設置
///
/// int __stdcall SetupSubChannel(HANDLE hChannelHandle, int iSubChannel)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="iSubChannel">子通道號(0表示主通道,1表示主通道)</param>
/// <returns>成功返回0;失敗返回錯誤號 </returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetupSubChannel(IntPtr hChannelHandle, int iSubChannel);
/// <summary>
/// 3.4.2獲取雙編碼時數據流類型GetSubChannelStreamType
/// 說 明: 配合雙編碼模式使用,當設置雙編碼模式時,啓動錄像後,DSP會向上送兩種
/// 數據流,調用此函數得到主通道和子通道的數據流類型,供應用程序使用。
///
/// int __stdcall GetSubChannelStreamType(void *DataBuf, int FrameType)
/// </summary>
/// <param name="DataBuf">數據緩存區</param>
/// <param name="FrameType">幀類型</param>
/// <returns>
/// 0 其他數據
/// 1 主通道數據流的文件頭
/// 2 子通道數據流的文件頭
/// 3 主通道數據流的視頻幀類型
/// 4 子通道數據流的視頻幀類型
/// 5 數據流的音頻幀
/// </returns>
[DllImport("DS40xxSDK.dll")]
public static extern int GetSubChannelStreamType(IntPtr DataBuf, int FrameType);
#region 3.4.3編碼流類型的設置及獲取(不支持動態修改)
/// <summary>
/// 3.4.3.1設置主通道編碼流類型SetStreamType
/// 說 明: 設置主通道編碼流類型。此函數需在啓動編碼前進行設置
///
/// int __stdcall SetStreamType(HANDLE hChannelHandle, USHORT Type)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="Type">流類型</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetStreamType(IntPtr hChannelHandle, ushort Type);
/// <summary>
/// 3.4.3.2獲取主通道編碼流類型GetStreamType
/// 說 明: 獲取主通道編碼流類型
///
/// int __stdcall GetStreamType(HANDLE hChannelHandle, USHORT *StreamType)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="StreamType">流類型</param>
/// <returns>成功返回0;失敗返回錯誤號 </returns>
[DllImport("DS40xxSDK.dll")]
public static extern int GetStreamType(IntPtr hChannelHandle, ref ushort StreamType);
/// <summary>
/// 3.4.3.3設置子通道編碼流類型SetSubStreamType
/// 說 明: 設置子通道編碼流類型,此函數需在啓動編碼前進行設置
///
/// int __stdcall SetSubStreamType(HANDLE hChannelHandle, USHORT Type)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="Type">流類型</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetSubStreamType(IntPtr hChannelHandle, ref ushort Type);
/// <summary>
/// 3.4.3.4獲取子通道編碼流類型GetSubStreamType
/// 說 明: 獲取子通道編碼流類型
///
/// int __stdcall GetSubStreamType(HANDLE hChannelHandle, USHORT *StreamType)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="StreamType">流類型</param>
/// <returns></returns>
[DllImport("DS40xxSDK.dll")]
public static extern int GetSubStreamType(IntPtr hChannelHandle, ref ushort StreamType);
#endregion
#region 3.4.4(支持動態修改)的編碼參數設置
/// <summary>
/// 3.4.4.1設置編碼圖像質量SetDefaultQuant
/// 說 明: 設置圖像量化係數,用於調整圖像質量。量化係數越小圖像質量越高。系統默認量化係數值爲18,18,23。
/// 釋 義: 量化係數
/// 量化係數是強烈影響MPEG標準中編碼圖像質量和碼率的參數,當量化係數越低,圖
/// 像質量就會越高,碼率也就越高,反之,圖形質量就會越低,碼率也就越低
///
/// int __stdcall SetDefaultQuant(HANDLE hChannelHandle, int IQuantVal, int PQuantVal, int BQuantVal)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="IQuantVal">I幀量化係數,取值範圍:12-30</param>
/// <param name="PQuantVal">P幀量化係數。取值範圍:12-30(目前無效)</param>
/// <param name="BQuantVal">B幀量化係數。取值範圍:12-30(目前無效)</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetDefaultQuant(IntPtr hChannelHandle, int IQuantVal, int PQuantVal, int BQuantVal);
/// <summary>
/// 3.4.4.2設置編碼幀結構、幀率SetIBPMode
/// 說 明: 設置編碼幀結構和幀率。支持動態修改
/// 釋 義: 關鍵幀間隔
/// 關鍵幀爲編碼碼流中採用幀內壓縮的圖像幀,其特點是圖像清晰度好,但數據量大,通
/// 常作爲幀間編碼的原始參考幀。關鍵幀間隔是連續的幀間編碼的幀個數,因H264(MPEG4)
/// 編碼是有損壓縮,關鍵幀的個數會影響圖像質量,因此關鍵幀的間隔需要合理設計。
///
/// int __stdcall SetIBPMode(HANDLE hChannelHandle, int KeyFrameIntervals, int BFrames, int PFrames, int FrameRate)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="KeyFrameIntervals">關鍵幀間隔。取值範圍1-400,系統默認爲100</param>
/// <param name="BFrames">B幀數量,取值爲0或者2,系統默認爲2 </param>
/// <param name="PFrames">P幀數量。目前暫取值無效</param>
/// <param name="FrameRate">幀率,幀率範圍1-25(PAL)、1-30(NTSC)</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetIBPMode(IntPtr hChannelHandle, int KeyFrameIntervals, int BFrames, int PFrames, int FrameRate);
#region 3.4.4.3設置編碼分辨率
/// <summary>
/// 3.4.4.3.1設置主通道分辨率SetEncoderPictureFormat
/// 說 明: 設置主通道編碼分辨率。支持動態修改。
///
/// int __stdcall SetEncoderPictureFormat(HANDLE hChannelHandle, PictureFormat_t PictureFormat)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="PictureFormat">編碼圖像分辨率(4CIF、DCIF、2CIF、CIF、QCIF) </param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetEncoderPictureFormat(IntPtr hChannelHandle, PictureFormat_t PictureFormat);
/// <summary>
/// 3.4.4.3.2設置子通道編碼分辨率SetSubEncoderPictureFormat
/// 說 明: 設置雙編碼模式時子通道的編碼分辨率,支持動態修改。
///
/// int __stdcall SetSubEncoderPictureFormat(HANDLE hChannelHandle, PictureFormat_t PictureFormat)
/// </summary>
/// <param name="hChannelHandle">子通道句柄</param>
/// <param name="PictureFormat">子通道編碼圖像分辨率(4CIF、DCIF、2CIF、CIF、 QCIF) </param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetSubEncoderPictureFormat(IntPtr hChannelHandle, PictureFormat_t PictureFormat);
#endregion
#region 3.4.4.4設置碼率及碼流控制模式
/// <summary>
/// 3.4.4.4.1設置碼流最大比特率SetupBitrateControl
/// 說 明: 設置編碼的最大比特率。設置爲0時碼流控制無效,設置爲某一最大比特率時,
/// 當編碼碼流超過該值時,DSP會自動調整編碼參數來保證不超過最大比特率,當編碼碼流
/// 低於最大比特率時,DSP不進行干涉。調整誤差<10%
///
/// int __stdcall SetupBitrateControl(HANDLE hChannelHandle, ULONG MaxBps)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="MaxBps">最大比特率。取值:10000以上</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetupBitrateControl(IntPtr hChannelHandle, ulong MaxBps);
/// <summary>
/// 3.4.4.4.2設置碼流控制方式SetBitrateControlMode
/// 說 明: 設置編碼碼流控制方式。配合SetupBitrateControl使用。當設置爲變碼率(brVBR)
/// 時,最大比特率將作爲編碼碼流上限,由DSP在碼流上限下自動控制碼率,一般會自動回
/// 落到最低的狀態(由設定的圖像質量參數和關鍵幀間隔決定),能最大程度地降低帶寬和存
/// 儲空間,但存儲容量一般難以估算;當設置爲定碼率(brCBR)時,以最大比特率作爲編碼
/// 碼率參數恆定輸出碼流,不會自動回落到低碼流狀態,存儲容量可根據設定碼率的大小進行估算。
///
/// int __stdcall SetBitrateControlMode(HANDLE hChannelHandle, BitrateControlType_t brc)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="brc">碼流控制方式,分爲變碼率(brVBR)和恆定碼率 (brCBR)兩種方式 </param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetBitrateControlMode(IntPtr hChannelHandle, BitrateControlType_t brc);
#endregion
/// <summary>
/// 3.4.5強制設定I幀CaptureIFrame
/// 說 明: 將當前編碼幀強制設定爲I幀模式,可從碼流中提取該幀單獨用於網絡傳送。
///
/// int __stdcall CaptureIFrame(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int CaptureIFrame(IntPtr hChannelHandle);
/// <summary>
/// 3.4.6獲取幀統計信息GetFramesStatistics
/// 說 明: 獲取幀統計信息
///
/// int __stdcall GetFramesStatistics(HANDLE hChannelHandle,PFRAMES_STATISTICS framesStatistics)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="framesStatistics">幀統計信息</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int GetFramesStatistics(IntPtr hChannelHandle, PFRAMES_STATISTICS framesStatistics);
#endregion
#endregion
#region 3.5數據捕獲
#region 3.5.1抓圖(獲取單幀圖像數據)
#region 3.5.1.1抓取BMP格式圖像
/// <summary>
/// 3.5.1.1.1獲取原始yuv422格式數據GetOriginalImage
/// 說 明: 獲得原始yuv422格式圖像,DS4000HC原始圖像是4CIF圖像格式(包括QCIF編碼),
/// DS-4000HS原始圖像爲CIF圖像格式,DS400xH卡的原始圖象是CIF圖象格式。
///
/// int __stdcall GetOriginalImage(HANDLE hChannelHandle, UCHAR *ImageBuf, ULONG *Size)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="ImageBuf">原始yuv422格式圖像指針</param>
/// <param name="Size">原始yuv422格式圖像尺寸,函數調用前是ImageBuf的大小,調用後是實際圖像所佔用的字節數 </param>
/// <returns>成功返回0,失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int GetOriginalImage(IntPtr hChannelHandle, byte[] ImageBuf, out int Size);
/// <summary>
/// 3.5.1.1.2圖像格式轉換YUVtoBMP SaveYUVToBmpFile
/// 說 明: 用戶程序可調用此函數來生成24位的bmp文件,如果是DS4000HC卡抓圖則
/// Width 爲704,Height 爲576PAL/480NTSC,如果是DS400xH卡抓圖則Width可能爲352
/// 或176,Height爲288、240、144或120,要根據緩衝區的大小來判斷。
///
/// int __stdcall SaveYUVToBmpFile(char *FileName, unsigned char *yuv, int Width, int Height)
/// </summary>
/// <param name="FileName">文件名</param>
/// <param name="yuv">yuv422格式圖像指針</param>
/// <param name="Width">圖像寬度</param>
/// <param name="Height">圖像高度</param>
/// <returns></returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SaveYUVToBmpFile(string FileName, byte[] yuv, int Width, int Height);
/// <summary>
/// 3.5.1.2抓取JPEG格式圖像GetJpegImage
/// 說 明: 抓取JPEG格式圖像
///
/// int __stdcall GetJpegImage(HANDLE hChannelHandle,UCHAR *ImageBuf, ULONG *Size,UINT nQuality)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="ImageBuf">JPEG圖像指針</param>
/// <param name="Size">JPEG圖像尺寸,函數調用前是ImageBuf的大小,調用後是實際圖像所佔用的字節數 </param>
/// <param name="nQuality">JPEG圖像質量,取值範圍1-100,取值100時質量最好</param>
/// <returns></returns>
[DllImport("DS40xxSDK.dll")]
public static extern int GetJpegImage(IntPtr hChannelHandle, byte[] ImageBuf, out int Size, uint nQuality);
#endregion
#region 3.5.2原始圖像數據流捕獲(獲取YUV420格式數據流)
/// <summary>
/// 3.5.2.1註冊原始圖像數據流回調函數RegisterImageStreamCallback
/// 說 明: 註冊獲取原始圖像數據流函數,用戶可以獲取實時的YUV420格式的預覽數據
///
/// int __stdcall RegisterImageStreamCallback (IMAGE_STREAM_CALLBACK ImageStreamCallback,void *context)
/// </summary>
/// <param name="ImageStreamCallback">原始圖像數據流回調函數 </param>
/// <param name="context">設備上下文</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int RegisterImageStreamCallback(IMAGE_STREAM_CALLBACK ImageStreamCallback, IntPtr context);
/// <summary>
/// 3.5.2.2開啓及停止原始數據流捕獲SetImageStream
/// 說明: 開啓或停止原始圖像數據流捕獲,此函數依賴主機的處理速度。DS-4000HS只能捕獲不大於CIF格式的數據流
///
/// 函 數: int __stdcall SetImageStream(HANDLE hChannel,BOOL bStart,UINT fps, UINT width,UINT height,unsigned char *imageBuffer)
/// </summary>
/// <param name="hChannel">通道句柄</param>
/// <param name="bStart">是否啓動捕獲</param>
/// <param name="fps">幀率</param>
/// <param name="width">圖像寬度,必須是4CIF寬度的1/8,1/4,1/2或原始大小704</param>
/// <param name="height">圖象高度,必須是4CIF高度的1/8,1/4,1/2或原始大小576PAL/480NTSC</param>
/// <param name="imageBuffer">數據存儲緩存</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetImageStream(IntPtr hChannel, bool bStart, uint fps, uint width, uint height, char[] imageBuffer);
#endregion
#region 3.5.3編碼數據流捕獲(獲取編碼後H.264格式數據流)即錄像
//注意:註冊直接回調或者消息回調後,需要啓動編碼數據流捕獲函數才能進行數據回調。三
//種數據回調方式,只需選取其中一種使用即可。對於HC系列板卡(包括HC、HC+、HCS、
//HS),推薦使用第一種讀取方式。對於H系列板卡,只能使用後兩種讀取方式。
#region 3.5.3.1編碼數據流捕獲方式設置
/// <summary>
/// 3.5.3.1.1.1註冊編碼圖像數據流直接讀取回調函數
/// 說 明: DS4000HC系列板卡新增的一種數據流讀取方式,當啓動數據捕獲後,
/// StreamDirectReadCallback會提供數據流的地址、長度、幀類型等,供用戶程序直接處理。
///
/// 函 數: int __stdcall RegisterStreamDirectReadCallback (STREAM_DIRECT_READ_CALLBACK StreamDirectReadCallback,void *Context)
/// </summary>
/// <param name="StreamDirectReadCallback">編碼數據流直接讀取回調函數</param>
/// <param name="context">設備上下文</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int RegisterStreamDirectReadCallback(STREAM_DIRECT_READ_CALLBACK StreamDirectReadCallback, IntPtr context);
#endregion
#region 3.5.3.1.2方式二、消息讀取方式
/// <summary>
/// 3.5.3.1.2.1設置消息讀取伐值,此函數只對H卡有效
/// 說 明: 設置消息讀取的伐值,可以將緩衝區的數據在OnDataReady中一次性取走
///
/// int __stdcall SetupNotifyThreshold(HANDLE hChannelHandle, int iFramesThreshold)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="iFramesThreshold">讀取消息伐值,範圍1-10</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetupNotifyThreshold(IntPtr hChannelHandle, int iFramesThreshold);
/// <summary>
/// 3.5.3.1.2.2註冊消息讀取碼流函數
/// 說 明: 當數據準備好時,SDK會向hWnd窗口發送MessageId消息,目標窗口收到
/// Message後調用ReadStreamData讀取一幀數據。如果HC卡與H卡混插,可以先調用
/// RegisterStreamDirectReadCallback函數來註冊HC卡取碼流回調函數,再調用
/// RegisterMessageNotifyHandle函數來註冊H卡取碼流消息函數。
/// HC系列板卡建議使用方式一進行數據捕獲。
///
/// int __stdcall RegisterMessageNotifyHandle(HWND hWnd, UINT MessageId)
/// </summary>
/// <param name="hWnd">通道句柄</param>
/// <param name="MessageId">自定義消息</param>
/// <returns>成功返回0;失敗返回錯誤號 </returns>
[DllImport("DS40xxSDK.dll")]
public static extern int RegisterMessageNotifyHandle(IntPtr hWnd, uint MessageId);
#endregion
#region 3.5.3.1.3方式三、另一種直接讀取方式
/// <summary>
/// 3.5.3.1.3.1註冊直接讀取碼流回調函數
/// 說 明: 另一種數據流讀取方式
///
/// int __stdcall RegisterStreamReadCallback (STREAM_READ_CALLBACK StreamReadCallback, void *Context)
/// </summary>
/// <param name="StreamReadCallback">直接讀取碼流回調函數</param>
/// <param name="Context">設備上下文</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int RegisterStreamReadCallback(STREAM_READ_CALLBACK StreamReadCallback, IntPtr Context);
#endregion
/// <summary>
/// 3.5.3.2讀取碼流函數
/// 說 明: 讀指定長度的數據流,適用於方式二及方式三。當調用StartVideoCapture 或
/// StartMotionDetection後,SDK線程會向已註冊的用戶窗口消息處理函數發送指定的消息,
/// 並提供消息來源的通道號。當用戶程序收到該消息時,可調用本函數來讀取數據,Length 在
/// 作爲輸入時必須提供緩衝的大小,ReadStreamData會判斷緩衝是否足夠,如果緩衝足夠大
/// 則返回值爲當前的讀取的幀長度,否則返回錯誤。
/// 在HC卡中,如果已經先調用了RegisterStreamDirectReadCallback()函數,則不需調用
/// ReadStreamData來讀取數據,因爲音視頻數據會在RegisterStreamDirectReadCallback所註冊
/// 的回調函數中直接返回。
///
/// int __stdcall ReadStreamData(HANDLE hChannelHandle, void *DataBuf, DWORD *Length, int *FrameType)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="DataBuf">自定義的數據緩存區</param>
/// <param name="Length">輸入:緩存區的大小;輸出:一幀數據的大小</param>
/// <param name="FrameType">幀類型</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int ReadStreamData(IntPtr hChannelHandle, byte[] DataBuf, out ulong Length, out int FrameType);
#region 3.5.3.3開啓及停止錄像
/// <summary>
/// 3.5.3.3.1啓動主通道編碼數據流捕獲
/// 說 明: 啓動主通道編碼數據流捕獲。用戶程序可以使用直接讀取方式,使用
/// StreamDirectReadCallback回調函數直接對數據流進行處理;也可以與H卡一樣,通過消息
/// 讀取方式,等SDK向用戶程序發送在RegisterMessageNotifyHandle中註冊的消息,用戶程
/// 序使用ReadStreamData來讀取數據流。
///
/// int __stdcall StartVideoCapture(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int StartVideoCapture(IntPtr hChannelHandle);
/// <summary>
/// 3.5.3.3.2停止主通道編碼數據流捕獲
/// 說 明: 停止主通道編碼數據流捕獲
///
/// int __stdcall StopVideoCapture(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int StopVideoCapture(IntPtr hChannelHandle);
/// <summary>
/// 3.5.3.3.3啓動子通道編碼數據流捕獲
/// 說 明: 啓動子通道編碼數據流捕獲
///
/// int __stdcall StartSubVideoCapture(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int StartSubVideoCapture(IntPtr hChannelHandle);
/// <summary>
/// 3.5.3.3.4停止子通道編碼數據流捕獲
/// 說 明: 停止子通道編碼數據流捕獲
///
/// int __stdcall StopSubVideoCapture(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <returns>成功返回0;失敗返回錯誤號 </returns>
[DllImport("DS40xxSDK.dll")]
public static extern int StopSubVideoCapture(IntPtr hChannelHandle);
#endregion
#endregion
#endregion
#endregion
#region 3.6移動偵測
// 釋 義: 移動偵測
//DS4000HC提供運動強度信息來處理運動檢測,設置移動偵測區域時以32*32像素塊爲
//單位,按4CIF(704*576)分辨率計算,每行有22個塊(704/32),PAL時18行(576/32),
//NTSC時15行(480/32),與編碼格式無關。經過測試,這種方法比H卡提高了靈敏度和可
//靠性,並簡化了返回的數據,返回的值是18個DWORD,對應屏幕高度576/32=18行(PAL),
//每個DWORD的0-21位對應屏幕寬度704/32=22, 其中1爲運動,0爲靜止,也可以調用原有
//MotionAnalyzer分析結果
//4.0版本的SDK新增了接口函數SetupMotionDetectionEx,提供了更靈活的功能,並且
//簡化了用戶的工作量。
#region 3.6.1設置方式一
// 設置移動偵測相關參數並啓動移動偵測後,運動檢測信息會通過數據流傳送,用戶程序
//發現PktMotionDetection幀類型時,可調用MotionAnalyzer來處理運動信息,結果由
//MotionAnalyzer在iResult中返回。也可以按照SDK提供的數據格式來自己分析,運動信息格
//式參見移動偵測釋義。
/// <summary>
/// 3.6.1.1設置移動偵測靈敏度
/// 說 明: 調整運動分析的靈敏度,支持動態調整,此函數決定DSP全局運動分析的靈敏度。
/// 而MotionAnalyzer的iThreshold則主要用於分析指定區域的運動統計結果。
///
/// int __stdcall AdjustMotionDetectPrecision(HANDLE hChannelHandle, int iGrade, int iFastMotionDetectFps, int iSlowMotionDetectFps)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="iGrade">
/// 運動分析靈敏度等級,取值範圍0-6,0級最靈敏,6級最遲鈍,推薦值爲2。
/// 將iGrade和“0x80000000“做”或“操作,會對移動偵測啓用自適應分析。
/// </param>
/// <param name="iFastMotionDetectFps">高速運動檢測的幀間隔,取值範圍0-12,0表示不作高速運動檢測,通常值取爲2</param>
/// <param name="iSlowMotionDetectFps">低速運動檢測的幀間隔,取值範圍13以上,當取值爲0時,不作低速運動檢測</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int AdjustMotionDetectPrecision(IntPtr hChannelHandle, int iGrade, int iFastMotionDetectFps, int iSlowMotionDetectFps);
/// <summary>
/// 3.6.1.2設置移動偵測區域範圍及個數
/// 說 明: 設置運動檢測區域;當收到運動信息的數據幀(PktMotionDetection)時,調用
/// MotionAnalyzer;MotionAnalyzer會根據在SetupMotionDetection中的設置來分析每個需要
/// 檢測的區域,當某區域的閥值(MotionAnalyzer的iThreshold)到達時,會在返回的區域數組
/// (MotionAnalyzer的iResult)標明最後的判斷;矩形框範圍是(0,0,703,575)
///
/// int __stdcall SetupMotionDetection(HANDLE hChannelHandle, RECT *RectList, int iAreas)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="RectList">矩形框數組</param>
/// <param name="iAreas">矩形框個數,最大值爲100</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetupMotionDetection(IntPtr hChannelHandle, ref Rectangle RectList, int iAreas);
/// <summary>
/// 3.6.1.3移動偵測分析
/// 說 明: 動態監測分析,移動偵測由DSP完成,DSP送出的IPktMotionData幀就是已經
/// 分析好的運動信息,區域的運動分析由主機完成,數據源由碼流中的PktMotionData幀提供,
/// 結果在iResult中說明,2.0以上版本的運動分析基於DSP提供的運動強度,不再使用運動
/// 矢量,其靈敏度及可靠性有大幅提高,用戶軟件可使用由碼流提供的運動強度信息來自己分
/// 析或調用該函數來進行區域分析
///
/// 函 數: int __stdcall MotionAnalyzer(HANDLE hChannelHandle, char *MotionData, int iThreshold, int *iResult)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="MotionData">運動矢量指針</param>
/// <param name="iThreshold">判斷運動程度的伐值</param>
/// <param name="iResult">按照伐值指定的強度分析後的結果數組。數組的大小在SetupMotionDetection的numberOfAreas指定,如果某數組單元的值大於零則表明有該區域有該值表明的運動強度</param>
/// <returns>成功返回0;失敗返回錯誤號 </returns>
[DllImport("DS40xxSDK.dll")]
public static extern int MotionAnalyzer(IntPtr hChannelHandle, char[] MotionData, int iThreshold, ref int iResult);
#endregion
#region 3.6.2設置方式二
/// <summary>
/// 3.6.2.1設置移動偵測(擴展)
/// 說 明: 設置移動偵測,這種設置方式可替代設置方式一中3個函數的共同作用,在這種情況下,DSP將不再反饋移動偵測幀。
/// 參數delay:畫面靜止之後的延時時間,單位爲秒,若在該延時時間內沒有產生
/// 移動偵測,則將回調函數MotionDetectionCallback之中的參數bMotionDetected標誌爲False,
/// 若在該延時時間之內,在當前所設置的區域內產生移動偵測,則bMotionDetected被標誌爲
/// True,並且在產生移動偵測之後的delay時間內,DSP不會對在此時間段之內的視頻幀進行
/// 移動偵測分析,因此DSP和主機都省卻了在此時間段對產生的視頻運動進行頻繁判斷和分
/// 析。直至超過了此delay秒延時時間,DSP纔會對此時刻的視頻進行判斷,若產生了移動偵
/// 測,則回調函數中的bMotionDetected被再次標誌爲True,否則標誌爲False。
///
///
/// 函 數: int __stdcall SetupMotionDetectionEx(HANDLE hChannelHandle,int iGrade, int iFastMotionDetectFps, int iSlowMotionDetectFps,UINT delay,RECT *RectList, int iAreas, MOTION_DETECTION_CALLBACK MotionDetectionCallback,int reserved)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="iGrade">
/// 運動分析靈敏度等級,取值範圍0-6,0級最靈敏,6級最遲鈍,
/// 推薦值2。將iGrade和“0x80000000“做”或“操作,會對移動偵測啓用
/// 自適應分析。
/// </param>
/// <param name="iFastMotionDetectFps">高速運動檢測的幀間隔,取值範圍0-12,0表示不作高速運動檢測,通常值取爲2</param>
/// <param name="iSlowMotionDetectFps">低速運動檢測的幀間隔,取值範圍13以上,當取值爲0時,不作低速運動檢測</param>
/// <param name="delay">前一次移動幀測產生後的延時時間</param>
/// <param name="RectList">進行移動偵測的矩形框數組</param>
/// <param name="iAreas">矩形框個數(最大個數爲100)</param>
/// <param name="MotionDetectionCallback">移動偵測結果回調函數 </param>
/// <param name="reserved">保留參數</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetupMotionDetectionEx(IntPtr hChannelHandle, int iGrade, int iFastMotionDetectFps, int iSlowMotionDetectFps, uint delay, ref Rectangle RectList, int iAreas, MOTION_DETECTION_CALLBACK MotionDetectionCallback, int reserved);
#endregion
#region 3.6.3啓動及停止移動偵測
/// <summary>
/// 3.6.3.1啓動移動偵測
/// 說 明: 啓動移動偵測。
/// 注意:移動偵測和編碼相互獨立,用戶程序可在不啓動編碼的情況下進行運動檢測
///
/// int __stdcall StartMotionDetection(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int StartMotionDetection(IntPtr hChannelHandle);
/// <summary>
/// 3.6.3.2停止移動偵測
/// 說 明: 停止移動偵測
///
/// int __stdcall StopMotionDetection(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle"></param>
/// <returns></returns>
[DllImport("DS40xxSDK.dll")]
public static extern int StopMotionDetection(IntPtr hChannelHandle);
#endregion
#endregion
#region 3.7視頻信息疊加
#region 3.7.1信息疊入視頻編碼(OSD、LOGO、MASK)
//注意:使用此部分函數時,在錄像文件中,包含所疊加的信息
#region 3.7.1.1 OSD
/// <summary>
/// 3.7.1.1.1設置OSD顯示模式
///
/// 函 數: int __stdcall SetOsdDisplayMode(HANDLE hChannelHandle, int Brightness, BOOL Translucent, int parameter, USHORT *Format1, USHORT *Format2)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="Brightness">OSD顯示亮度。0最暗,255最亮</param>
/// <param name="Translucent">OSD圖像是否做半透明處理</param>
/// <param name="parameter">Bit0:是否自動進行顏色翻轉 Bit16-23垂直放大倍數 Bit24-31水平 </param>
/// <param name="Format1">描述字符疊加的位置和次序的格式</param>
/// <param name="Format2"></param>
#region USHORT *Forma1, *Format2
//USHORT *Forma1, *Format2
//描述字符疊加的位置和次序的格式串,具體定義如下:
//USHORT X, USHORT Y, CHAR0, CHAR1, CHAR2,… CHARN, NULL
// 其中X,Y 是該字串在標準4CIF圖象的起始位置,X必須是16的倍數,Y可以在圖
//象高度內取值即(0-575)PAL 、(0-479)NTSC;CHARN也是USHORT型的參數,可以
//是ASCII碼也可以是漢字,當想要顯示當前時間時,可以指定爲固定的時間定義值,其值
//如下:
//_OSD_YEAR4 四位的年顯示,如2004
//_OSD_YEAR2 兩位的年顯示,如02
//_OSD_MONTH3 英文的月顯示,如 Jan
//_OSD_MONTH2 兩位阿拉伯數字的月顯示,如07
//_OSD_DAY 兩位的阿拉伯數字的日顯示,如31
//_OSD_WEEK3 英文的星期顯示,如Tue
//_OSD_CWEEK1 中文的星期顯示,如星期二
// _OSD_HOUR24 24小時的時鐘顯示,如18
//_OSD_HOUR12 12小時的時鐘顯示,如AM09或PM09
//_OSD_MINUTE 兩位分鐘的顯示
//_OSD_SECOND 兩位秒的顯示
//在格式字符串的最後必須以NULL(0)結尾,否則會顯示錯誤的內容。
//字符串和時間顯示可以在FORMAT1 也可以在FORMAT2,也可以混合在一起,但不得超
//過一行4CIF 圖象的寬度。
//例如:
//要顯示位置在16,19的字符串“辦公室”的格式字符串如下:
// USHORT Format[] = {16, 19, ‘辦’,’公’,’室’, ‘\0’};
//要顯示位置在8, 3的時間字符串可以如下:
// USHORT Format[]={8, 3, _OSD_YEAR4, ‘年’,_OSD_MONTH2,’月’,_OSD_DAY,
//‘日’,_OSD_HOUR24,’:’, _OSD_MINUTE, ‘:’, _OSD_SECOND, ‘\0’};
//如果只想顯示其中一行,則將起始的字符串定義如下:
// USHORT FormatNoDisplay[]={0, 0, ‘\0’};
//返回值: 成功返回0;失敗返回錯誤號
//說 明: OSD字符中,ASCII字符的標準分辨率爲8×16,漢字的標準分辨率爲16×16。
//由於在編碼之前需要對原始圖像進行縮小才能產生編碼所需的分辨率,此時爲了保證在
//縮小後的編碼圖像上能夠看清OSD字符,就需要先把OSD字符放大以後再疊加在4CIF的
//原始圖像上。
//如果不指定放大倍數(採用默認設置),則系統會根據該通道錄像的分辨率自動設置,
//這樣在任何分辨率下都可以保證回放時能夠看清OSD內容,但是這會導致OSD的大小和位
//置在原始圖像中不固定。
//爲了避免上面的現象,用戶可以指定OSD的大小。例如,如果應用程序想以CIF、DCIF、
//2CIF、4CIF的分辨率錄像,這時候可以將放大係數設爲2、2,此時OSD的位置始終固定,
//但在不同的編碼分辨率下,OSD字符的分辨率也不同,所以需要特別注意。如果此時使用
//QCIF錄像,則OSD字符會變得模糊不清(因爲QCIF要對圖像進行1/4縮小,而對OSD
//字符只進行了2倍的放大)。具體配置詳見下表:
//水平放大倍數 垂直放大倍數 適合的錄像分辨率 說明
//1 1 4CIF 其它分辨率下會模糊
//1 2 2CIF 小於2CIF時無法分辯
//2 2 CIF、DCIF QCIF時無法分辯
//4 4 QCIF 在其它分辨率下字符會很大
//任意係數爲0 自動設置(默認值)
//其它無效值 按水平2、垂直2處理
//注意:因爲字符的位置會隨着不同的錄像分辨率而改變,在位置改變後,某些OSD字符的
//位置可能會超出圖像的範圍,此時這些字符將無法顯示,但系統並不會返回錯誤。
#endregion
/// <returns></returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetOsdDisplayMode(IntPtr hChannelHandle, int Brightness, bool Translucent, int parameter, ushort[] Format1, ushort[] Format2);
/// <summary>
/// 3.7.1.1.2設置OSD顯示模式(擴展)
/// 說 明: 此函數爲SetOsdDisplayMode的擴展,SetOsdDisplayModeEx函數支持最多8行OSD字符串的顯示。
///
/// int __stdcall SetOsdDisplayModeEx(HANDLE hChannelHandle,int color, BOOL Translucent,int param,int nLineCount,USHORT **Format)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="Brightness">OSD顯示亮度。0最暗,255最亮</param>
/// <param name="Translucent">OSD圖像是否做半透明處理</param>
/// <param name="param">Bit0:是否自動進行顏色翻轉 Bit16-23垂直放大倍數 Bit24-31水平放大倍數</param>
/// <param name="nLineCount">OSD顯示的行數,最多爲8行</param>
/// <param name="Format">多行字符顯示
/// USHORT **Format;多行字符顯示,描述字符疊加的位置和次序的格式串,
/// 其中每一行的第一元素X和第二元素Y 是該字串在標準4CIF圖象的起始位置,X必須是
/// 16的倍數,Y可以在圖象高度內取值即(0-575)PAL 、(0-479)NTSC;可以是ASCII碼
/// 也可以是漢字,當想要顯示當前時間時,可以指定爲固定的時間定義值,其值如下:
/// _OSD_YEAR4 四位的年顯示,如2004
/// _OSD_YEAR2 兩位的年顯示,如02
/// _OSD_MONTH3 英文的月顯示,如 Jan
/// _OSD_MONTH2 兩位阿拉伯數字的月顯示,如07
/// _OSD_DAY 兩位的阿拉伯數字的日顯示,如31
/// _OSD_WEEK3 英文的星期顯示,如Tue
/// _OSD_CWEEK1 中文的星期顯示,如星期二
/// _OSD_HOUR24 24小時的時鐘顯示,如18
/// _OSD_HOUR12 12小時的時鐘顯示,如AM09或PM09
/// _OSD_MINUTE 兩位分鐘的顯示
/// _OSD_SECOND 兩位秒的顯示
/// 在格式字符串的每一行最後一個元素必須以NULL(0)結尾,否則會顯示錯誤的內容。
/// 返回值: 成功返回0;失敗返回錯誤號。
/// 說 明: 此函數爲SetOsdDisplayMode的擴展,SetOsdDisplayModeEx函數支持最多8行
/// OSD字符串的顯示。
/// </param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetOsdDisplayModeEx(IntPtr hChannelHandle, int Brightness, bool Translucent, int param, int nLineCount, char[] Format);
/// <summary>
/// 3.7.1.1.3設置OSD顯示
/// 說 明: 設置OSD顯示,將當前的系統時間年月日星期時分秒等信息疊加在視頻之上,並可作透明處理。
///
/// int __stdcall SetOsd(HANDLE hChannelHandle, BOOL Enable)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="Enable">OSD是否顯示</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetOsd(IntPtr hChannelHandle, bool Enable);
#endregion
#region 3.7.1.2 LOGO
/// <summary>
/// 3.7.1.2.1數據格式轉換
/// 說 明: 將24位bmp格式圖像轉換爲yuv422格式圖像。
/// 注意:bmp位圖的長寬必須爲16的倍數,圖像尺寸最大支持128*128,4.3版本SDK圖像尺寸擴大爲256*128
///
/// 函 數: int __stdcall LoadYUVFromBmpFile(char *FileName, unsigned char *yuv, int BufLen, int *Width, int *Height)
/// </summary>
/// <param name="FileName">文件名</param>
/// <param name="yuv">YUV422圖像指針 </param>
/// <param name="BufLen">YUV422圖像緩存大小</param>
/// <param name="Width">返回的YUV422圖像的寬度</param>
/// <param name="Height">返回的YUV422圖像的高度</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int LoadYUVFromBmpFile(string FileName, string yuv, int BufLen, ref int Width, ref int Height);
/// <summary>
/// 3.7.1.2.2設置LOGO顯示模式
/// 說 明: 設置LOGO顯示模式
///
/// 函 數: int __stdcall SetLogoDisplayMode(HANDLE hChannelHandle, COLORREF ColorKey, BOOL Translucent, int TwinkleInterval)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="ColorKey">LOGO圖像中該顏色在顯示時將會全透明</param>
/// <param name="Translucent">LOGO圖像是否作半透明處理</param>
/// <param name="TwinkleInterval">閃爍的時間設置,由16進制數表示爲0xXXYY,其中XX爲顯示的秒數,YY爲停止的秒數,XXYY均爲0時正常顯示。</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetLogoDisplayMode(IntPtr hChannelHandle, Color ColorKey, bool Translucent, int TwinkleInterval);
/// <summary>
/// 3.7.1.2.3設置LOGO顯示位置及數據
/// 說 明: 設置LOGO圖像位置及數據,用戶程序可先調用LoadYUVFromBmpFile將24
/// 位bmp文件中轉化爲YUV422格式數據,,透明處理由DSP完成。
/// 注意:HS卡的x,w需要按照32對齊,y,h仍爲8對齊。
///
/// 函 數: int __stdcall SetLogo(HANDLE hChannelHandle, int x, int y, int w, int h, unsigned char *yuv)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="x">LOGO左上角x座標位置,取值範圍0-703,需按16對齊</param>
/// <param name="y">LOGO左上角y座標位置,取值範圍0-575,需按8對齊</param>
/// <param name="w">LOGO寬度,最大值爲256,需按16對齊,此寬度必須和LOGO圖片的寬度相一致</param>
/// <param name="h">LOGO高度,最大值爲128,需按8對齊</param>
/// <param name="yuv">LOGO圖片指針(yuv422格式)</param>
/// <returns>成功返回0;失敗返回錯誤號 </returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetLogo(IntPtr hChannelHandle, int x, int y, int w, int h, string yuv);
/// <summary>
/// 3.7.1.2.4停止LOGO顯示
/// 說 明: 停止LOGO顯示
///
/// int __stdcall StopLogo(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int StopLogo(IntPtr hChannelHandle);
#endregion
#region 3.7.1.3視頻遮擋MASK
/// <summary>
/// 3.7.1.3.1設置屏幕遮擋
/// 說 明: 設置屏幕遮擋,最多可以設置32個
///
/// int __stdcall SetupMask(HANDLE hChannelHandle, RECT *RectList, int iAreas)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="RectList">矩形框數組,寬度範圍0-704,按16對齊;高度範圍0-576,按</param>
/// <param name="iAreas">矩形框個數</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetupMask(IntPtr hChannelHandle, ref Rectangle RectList, int iAreas);
/// <summary>
/// 3.7.1.3.1停止屏幕遮擋
/// 說 明: 停止屏幕遮擋
///
/// int __stdcall StopMask(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int StopMask(IntPtr hChannelHandle);
#endregion
#endregion
#region 3.7.2僅在預覽畫面上疊加信息
// 注意:當採用overlay預覽模式時,可在overlay表面上直接疊加字符或畫圖,當採用offscreen
//預覽模式時,需要調用畫圖回調函數進行信息疊加,所疊加信息僅在預覽屏幕上顯示,不進
//入編碼。
//Offscreen預覽模式下畫圖回調函數
/// <summary>
/// 3.7.2.1註冊畫圖回調函數
/// 說 明: 獲取當前offscreen表面的device context,HC系列板卡採用創建offscreen的方
/// 式,所以在窗口客戶區中的DC中無法畫圖或者鞋子,必須使用DirectDraw裏的offscreen表面的DC。
/// 注意:如果採用overlay預覽模式,則直接在overlay表面畫圖即可,無需調用此函數
///
/// int __stdcall RegisterDrawFun(DWORD nport, DRAWFUN(DrawFun),LONG nUser)
/// </summary>
/// <param name="nport">通道號索引</param>
/// <param name="df">畫圖回調函數</param>
/// <param name="nUser">用戶數據</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int RegisterDrawFun(ulong nport, DrawFun df, long nUser);
//public static extern int RegisterDrawFun(ulong nport, DrawFun df, IntPtr nUser);
/// <summary>
/// 3.7.2.2停止畫圖回調
/// 說 明: 停止畫圖回調。在某些顯卡上進行畫圖回調,會使得CPU的利用率變高,所以可以在適當的時候(畫圖回調結束)停止調用。
///
/// int __stdcall StopRegisterDrawFun(DWORD nport)
/// </summary>
/// <param name="nport">通道索引</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int StopRegisterDrawFun(ulong nport);
#endregion
#endregion
#region 3.8音頻
/// <summary>
/// 3.8.1設置音頻預覽
/// 說 明: 設置音頻預覽與否,同一時間,系統只支持一路音頻預覽。需要將4針線和聲卡音頻輸入口聯接。
///
/// int __stdcall SetAudioPreview(HANDLE hChannelHandle, BOOL bEnable)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <param name="bEnable">使能</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetAudioPreview(IntPtr hChannelHandle, bool bEnable);
/// <summary>
/// 3.8.2獲取音頻輸入音量幅度
/// 說 明: 獲取當前通道的現場聲音幅度。
/// 注意:當無聲音輸入時因背景噪聲的原因返回值並不爲0。
///
/// int __stdcall GetSoundLevel(HANDLE hChannelHandle)
/// </summary>
/// <param name="hChannelHandle">通道句柄</param>
/// <returns>當前通道的音頻輸入幅度</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int GetSoundLevel(IntPtr hChannelHandle);
#endregion
#region 3.9其他
/// <summary>
/// 3.9.1復位DSP
/// 此函數目前無效
/// 說 明: 復位某個DSP,注意請謹慎調用該函數,請確定DSP故障無法軟件恢復時再關閉相關的資源後復位DSP。
///
/// int __stdcall ResetDSP(int DspNumber);
/// </summary>
/// <param name="DspNumber">DSP索引號</param>
/// <returns> 成功返回0;失敗返回錯誤號 </returns>
[DllImport("DS40xxSDK.dll")]
public static extern int ResetDSP(int DspNumber);
/// <summary>
/// 3.9.2設置看門狗
/// 說 明: 設置看門狗。DS-4016HCS提供4pin復位接口,用戶需要把主機機箱的Reset
/// 接線連接到板卡上相鄰的2pin復位接口,板卡上的另外相鄰的2pin接口連接到主板的Reset,
/// 這樣就可以實現對上層軟件和系統中所有壓縮板卡的運行狀態監控。
///
/// int __stdcall SetWatchDog(UINT boardNumber,BOOL bEnable)
/// </summary>
/// <param name="boardNumber">板卡索引</param>
/// <param name="bEnable">使能</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetWatchDog(uint boardNumber, bool bEnable);
#region 3.9.3碼流數字水印校驗
/// <summary>
/// 3.9.3.1設置主通道數字水印校驗
/// 說 明: 此函數不支持動態設置,設置後會在下一次啓動錄像後生效。
///
/// int __stdcall SetChannelStreamCRC(HANDLE hChannel,BOOL bEnable)
/// </summary>
/// <param name="hChannel">通道句柄</param>
/// <param name="bEnable">使能</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetChannelStreamCRC(IntPtr hChannel, bool bEnable);
/// <summary>
/// 3.9.3.2設置子通道數字水印校驗
/// 說 明: 此函數不支持動態設置,設置後會在下一次啓動錄像後生效。
///
/// int __stdcall SetSubChannelStreamCRC(HANDLE hChannel,BOOL bEnable)
/// </summary>
/// <param name="hChannel">通道句柄</param>
/// <param name="bEnable">使能</param>
/// <returns>成功返回0;失敗返回錯誤號</returns>
[DllImport("DS40xxSDK.dll")]
public static extern int SetSubChannelStreamCRC(IntPtr hChannel, bool bEnable);
#endregion
#endregion
#endregion
}
}
修改記錄
1. 2009-3-16,修改前本文備份:/Files/over140/2009/3/2009-3-16.rar
1.1 去掉了《4.解碼卡API 》,暫時用不上也佔文章太多行數,暫時去掉了。
1.2 GetSDKVersion 結構體一般需要加ref
VC++:int __stdcall GetSDKVersion(PVERSION_INFO VersionInfo)
C#[改前]:public static extern int GetSDKVersion(PVERSION_INFO VersionInfo);
C#[改後]:public static extern int GetSDKVersion(ref PVERSION_INFO VersionInfo);
1.3 抓圖函數GetJpegImage ,沒注意參數Size前面的*
VC++:int __stdcall GetJpegImage(HANDLE hChannelHandle,UCHAR *ImageBuf, ULONG *Size,UINT nQuality)
C#[改前]:public static extern int GetJpegImage(IntPtr hChannelHandle, byte[] ImageBuf, ulong Size, uint nQuality);
C#[改後]:public static extern int GetJpegImage(IntPtr hChannelHandle, byte[] ImageBuf, out int Size, uint nQuality);
1.4 抓圖函數GetOriginalImage,沒注意參數Size前面的*
VC++:int __stdcall GetOriginalImage(HANDLE hChannelHandle, UCHAR *ImageBuf, ULONG *Size)
C#[改前]:public static extern int GetOriginalImage(IntPtr hChannelHandle, byte[] ImageBuf, ulong Size);
C#[改後]:public static extern int GetOriginalImage(IntPtr hChannelHandle, byte[] ImageBuf, out int Size);
小節:一般結構體對應翻譯的話都要加ref;一般數值類型的加*對應都要加out。
2. 2009-3-19
2.1 GetBoardDetail
VC++原型:int __stdcall GetBoardDetail(UINT boardNum,DS_BOARD_DETAIL *pBoardDetail)
C# 改前:public static extern int GetBoardDetail(uint boardNum, DS_BOARD_DETAIL pBoardDetail);
C# 改後:public static extern int GetBoardDetail(uint boardNum, ref DS_BOARD_DETAIL pBoardDetail);
2.2 GetDspDetail
VC++原型:int __stdcall GetDspDetail(UINT dspNum,DSP_DETAIL *pDspDetail)
C# 改前:public static extern int GetDspDetail(uint dspNum, DSP_DETAIL pDspDetail);
C# 改後:public static extern int GetDspDetail(uint dspNum, ref DSP_DETAIL pDspDetail);
結束
在後續的文章中本文中API仍然可能會變動,畢竟我們用的只是其中的一部分,我會隨時更新,感謝繼續關注。本來是作爲一篇文章發佈的,發現代碼過長,插入都費老半天,所有拆開成上下了!!