You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:15:07