1.60 调用海康威视摄像头

3 个月前 · 来自专栏 WPF上位机开发系列

之前做过的一个监控项目,工业相机扫码和摄像头录制视频监控保存;

二次开发的一些关键性的东西,其实之前也给出来了;

正好这两天手头有摄像头测试,单独把摄像头部分的程序提取出来了,同时增加了 Http 方式获取数据流,并显示到 Image 控件上;

整个测试 Demo 放到 Github 上了,

激活设备建议直接网络登录 192.168.1.64 去弄,ivms 这个软件我总是没找到设备,明明以前一下就能搜索到;

需要注意的是,相机数量连接多了之后(差不多6、7个之后),CPU会直接爆,需要修改下参数:

/// 预览参数
//OnNoticed(string.Format("预览设备【{0}】参数", ListCameraInfos[i].DeviceName), EnumLogType.Debug);
CHCNetSDK.NET_DVR_PREVIEWINFO lpPreviewInfo = new CHCNetSDK.NET_DVR_PREVIEWINFO
    // 预览窗口
    hPlayWnd = MyPictureBoxes[i].Handle,
    // 预览的设备通道
    lChannel = ListCameraInfos[i].Channel,
    // 用以下设置不卡顿
    // 码流类型:0-主码流,1-子码流,2-码流3,3-码流4,以此类推
    dwStreamType = 1,  // 默认 0
    // 连接方式:0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTP
    dwLinkMode = 4,  // 默认 0
    // 0- 非阻塞取流,1- 阻塞取流
    bBlocked = true, // 默认 false
    // 播放库播放缓冲区最大缓冲帧数
    dwDisplayBufNum = 5, // 默认 1
    byProtoType = 0,
    byPreviewMode = 0

数据流方式,也查询了一些其他方法,但都没有尝试成功,最后用这个方式测试过了;

private void Init()
    Task.Run(() =>
        while (true)
            var request = WebRequest.Create("http://192.168.1.64:80/ISAPI/Streaming/channels/101/picture");
            request.Method = "GET";
            request.Credentials = new NetworkCredential("admin", "Big Wang");
            using (WebResponse webRes = request.GetResponse())
                int length = (int)webRes.ContentLength;
                HttpWebResponse response = webRes as HttpWebResponse;
                Stream stream = response.GetResponseStream();
                MemoryStream MemoryStream = new MemoryStream();
                byte[] buffer = new byte[length];
                int i;
                while ((i = stream.Read(buffer, 0, buffer.Length)) > 0)
                    MemoryStream.Write(buffer, 0, i);
                byte[] data = MemoryStream.ToArray();
                MemoryStream.Close();
                Dispatcher.Invoke(() => { Source = BytesToBitmapImage(data); });
            Thread.Sleep(10);
private BitmapImage BytesToBitmapImage(byte[] bytes)
    using (MemoryStream ms = new MemoryStream(bytes))
        BitmapImage result = new BitmapImage();
        result.BeginInit();
        result.StreamSource = ms;
        result.CacheOption = BitmapCacheOption.OnLoad;