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;