C# Winforms对接Amcrest IP摄像头MJPG流时PictureBox无更新如何解决
问题排查&解决步骤
- 1 先验证流地址有效性
直接在PC浏览器里输入你的流地址http://192.168.1.108/cgi-bin/mjpg/video.cgi?channel=1&subtype=0,输入用户名密码后看是否能正常加载出监控画面,先排除地址配置错误、摄像头网络不通的问题。 - 2 修正身份认证方式
Amcrest摄像头默认用Digest摘要认证,不要把用户名密码拼接在URL参数里,应该直接赋值给MJPEGStream的对应属性。 - 3 修复跨线程更新UI的问题
NewFrame事件是在后台工作线程触发的,Winform不允许直接在非UI线程修改控件属性,你之前没有报错大概率是项目开了跨线程操作忽略,但更新操作不会生效,需要用Invoke封送到UI线程执行。 - 4 可选补充:如果还是没有画面,可以给
MJPEGStream绑定Error事件,打印错误日志排查具体报错原因。
修改后完整代码参考
// 把stream对象提到类级别,避免被GC回收 private MJPEGStream _stream; private void Connect() { _stream = new MJPEGStream("http://192.168.1.108/cgi-bin/mjpg/video.cgi?channel=1&subtype=0"); _stream.Login = "admin"; _stream.Password = "pwd11"; _stream.NewFrame += video_NewFrame; // 绑定错误事件方便排查 _stream.Error += (s, e) => { System.Diagnostics.Debug.WriteLine($"流错误:{e.Exception.Message}"); }; _stream.Start(); } private void video_NewFrame(object sender, NewFrameEventArgs eventArgs) { Bitmap bmp = (Bitmap)eventArgs.Frame.Clone(); if (pictureBox1.IsHandleCreated) { this.Invoke(new Action(() => { // 先释放旧的图片资源,避免内存泄漏 pictureBox1.Image?.Dispose(); pictureBox1.Image = bmp; })); } } // 窗口关闭时记得停止流释放资源 private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (_stream != null && _stream.IsRunning) { _stream.Stop(); } }
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

