VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > C#教程 >
  • c#视频监控系列(7)服务器端—封装API下DS40xxSDK.dll中

制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
 

   #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.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



相关教程