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 " )]
#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);
本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/586683,如需转载请自行联系原作者