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

SwiftUI开发中MJPEG视频流无法更新视图内Image组件问题咨询

问题根因

@Published 属性包装器仅会在属性本身被重新赋值时触发 ObservableObject 的变更通知。你当前代码中:

  • MJPEGStream 类中 @Published 修饰的 stream 是引用类型的 MJPEGStreamLib 实例,运行过程中 stream 的引用地址没有发生变化,仅修改其内部的 image 属性不会触发 @Published 的更新通知
  • MJPEGStreamLib 的 image 属性没有任何发布机制,内部更新后外部无法感知,因此View不会刷新

最简修复方案

步骤1:改造MJPEGStreamLib支持变更发布

让MJPEGStreamLib遵守ObservableObject协议,给image属性添加@Published修饰:

import SwiftUI
import Combine

class MJPEGStreamLib: NSObject, URLSessionDataDelegate, ObservableObject {
    // 其余原有代码保持不变
    @Published var image = UIImage() // 仅修改这一行,添加@Published
}

步骤2:调整View的观测对象

直接让MpegView观测MJPEGStreamLib实例,接收image变更通知:

struct MpegView: View {
    // 直接观测MJPEGStreamLib实例,接收image更新
    @ObservedObject var mjpegStreamLib: MJPEGStreamLib
    
    var body: some View {
        Image(uiImage: mjpegStreamLib.image)
            .resizable()
    }
}

struct StreamView: View {
    @StateObject var stream = MJPEGStream()

    var body: some View {
        // 传入内部的MJPEGStreamLib实例
        MpegView(mjpegStreamLib: stream.stream)
            .background(.red)
            .frame(width: 200, height: 200)
    }
}

修改完成后新帧更新会自动触发View刷新,原有流处理逻辑无需改动。


内容的提问来源于stack exchange,提问作者gotnull

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:57:03