用海康的DS-4004HC板卡做监控,采用C#语言,设备监控与控制方面使用OPC
OPC不再重复,好简单的。DS-4004HC板卡做监控参考达人的系列帖子,基本不用变动,原帖地址如下:

这里要说的是关于移动侦测的方面,这点在原文中并没有提及,这里专门做这方面的介绍:
首先,移动侦测有两种方法:

           

Rectangle[] areaList = new Rectangle[1]; 
            Rectangle rect = new Rectangle(0, 0, 700, 500);//因为pdf里说“DS400C的矩形框范围是(0,0,703,575)” 
            areaList[0] = rect; 

(1)

java海康获取移动侦测解码 海康 移动侦测_idejava海康获取移动侦测解码 海康 移动侦测_java海康获取移动侦测解码_02Code
MOTION_DETECTION_CALLBACK mdc; 
        mdc = new MOTION_DETECTION_CALLBACK(MOTION_DETECTION_CALLBACK1);//注册移动侦测回调 
        HikVisionSDK.SetupMotionDetectionEx(ChannelHandle_Vedio, 2, 2, 0, 10, areaList, areaList.Length, mdc, 0); 

(2)

HikVisionSDK.AdjustMotionDetectPrecision(ChannelHandle_Vedio, 2, 2, 0); 
HikVisionSDK.SetupMotionDetection(ChannelHandle_Vedio, areaList, areaList.Length); 

然后在回调STREAM_DIRECT_READ_CALLBACK1(int channelNum, IntPtr DataBuf, int Length, FrameType_t frameType, IntPtr context)里添加:

 int[] result = new int[1];HikVisionSDK.MotionAnalyzer(ChannelHandle_Vedio, DataBuf, 20, result); 

每个函数的用法与说明看看那个大哥的DS40xxSDK.cs和海康的pdf里面写的很清晰地.

(3)当然别忘里开启移动侦测哦:HikVisionSDK.StartMotionDetection(ChannelHandle_Vedio);

可是不知道什么原因,按理说方案一比较简单,只要设置回调然后注册,接着启动移动侦测就好,可惜的是,每次当我出发后,处理完会叫后(回调里什么都没干),就会报错说DS40xxSDK.dll里异常结果崩溃,我想了半天也不知道哪里错了,也跟踪不进去,也许用VC做是正常的吧,又或者我哪里设置错了,但pdf里就是这样的,可惜海康demo程序没用到这个。解决此问题的大哥可以告诉我,学习下

于是乎,采用了方案二,毕竟然家海康demo里用的就是这个。事实证明用第二方案果然不报错了

把那位大哥的STREAM_DIRECT_READ_CALLBACK1回调修改下,加入移动侦测部分就搞定了,效果不错(代码内其他函数的说明,请看那个系列文章作者的说明):


java海康获取移动侦测解码 海康 移动侦测_idejava海康获取移动侦测解码 海康 移动侦测_java海康获取移动侦测解码_02Code
//该函数主要是通过MP4_ServerWriteDataEx将数据写入内存(文档注释:往发送缓存写数据。)和用_write写文件做存储视频录像。 
public int STREAM_DIRECT_READ_CALLBACK1(int channelNum, IntPtr DataBuf, int Length, FrameType_t frameType, IntPtr context) 

    int status = 0; 
    if (frameType > 0) 
    { 
        if (frameType == FrameType_t.PktSysHeader) 
        { 
            FileHeader = new byte[Length]; 
            Marshal.Copy(DataBuf, FileHeader, 0, Length); 
            FileHeaderLen = Length; 
        } 

        if (frameType == FrameType_t.PktIFrames || frameType == FrameType_t.PktSubIFrames) 
            status = 1; 
        else 
            status = 0; 

        /*if (frameType == FrameType_t.PktMotionDetection || frameType == FrameType_t.PktOrigImage) 
            return 0;*/ 
        if (frameType == FrameType_t.PktOrigImage) 
            return 0; 
        if (frameType == FrameType_t.PktMotionDetection) 
        { 
            int[] result = new int[1]; 
            HikVisionSDK.MotionAnalyzer(ChannelHandle_Vedio, DataBuf, 20, result); 
            if (result[0] > 0) 
            { 
                isMotion = true; 
            } 
            else 
                isMotion = false; 
            return 0; 
        } 
    } 

    if (Length == 0) 
    { 
        //TRACE("no data ?\n"); 
        return 0; 
    } 

    if (frameType == FrameType_t.PktAudioFrames) 
    { 
        if (isMotion)//判断是否处于运动状态 
        { 
            WriterVideoCapture(Length, DataBuf);//写入录像文件 
        } 
        //写文件 
        //    _write(gFileHandleQcif[channelNum],DataBuf,Length); 
        //HikServer.MP4_ServerWriteDataEx(channelNum, DataBuf, Length, (int)frameType, status, 1); 
        //    _write(gFileHandle[channelNum], DataBuf, Length); 
        HikServer.MP4_ServerWriteDataEx(channelNum, DataBuf, Length, (int)frameType, status, 0); 
    } 
    else if (frameType == FrameType_t.PktSubIFrames || frameType == FrameType_t.PktSubPFrames || frameType == FrameType_t.PktSubBBPFrames || frameType == FrameType_t.PktSubSysHeader) 
    { 
        //    _write(gFileHandleQcif[channelNum],DataBuf,Length); 
        HikServer.MP4_ServerWriteDataEx(channelNum, DataBuf, Length, (int)frameType, status, 1); 
    } 
    else 
    { 
        WriterVideoCapture(Length, DataBuf); 
        HikServer.MP4_ServerWriteDataEx(channelNum, DataBuf, Length, (int)frameType, status, 0); 
    } 

    return 0; 

对了,最后问个问题:怎么在写博客时黏贴代码啊,我看别人的都可以像在MSDN中的效果一样的,而我复制来的,就只是纯文本,我也想有那种效果,这样以后看博客,写博客也方便点!

新增板卡sdk,驱动与demo的下载地址: