| | |
| | | import MetalKit |
| | | |
| | | struct VideoRendererView: UIViewRepresentable { |
| | | let renderer: MetalRenderer // 自定义 Metal 渲染器,支持传入 RGBA/YUV 数据帧 |
| | | @Binding var pixelBuffer: CVPixelBuffer? |
| | | |
| | | //用 Coordinator 缓存实例 |
| | | func makeCoordinator() -> Coordinator { |
| | | return Coordinator() |
| | | } |
| | | |
| | | func makeUIView(context: Context) -> MTKView { |
| | | let view = MTKView() |
| | | view.device = MTLCreateSystemDefaultDevice() |
| | | view.colorPixelFormat = .bgra8Unorm |
| | | view.clearColor = MTLClearColor(red: 0.2, green: 0.5, blue: 0.7, alpha: 1.0) |
| | | view.delegate = renderer |
| | | view.isPaused = false |
| | | view.enableSetNeedsDisplay = false |
| | | renderer.setup(view: view) |
| | | return view |
| | | return context.coordinator.mtkView |
| | | } |
| | | |
| | | func updateUIView(_ uiView: MTKView, context: Context) {} |
| | | func updateUIView(_ uiView: MTKView, context: Context) { |
| | | if let buffer = pixelBuffer { |
| | | //print("updateUIView") |
| | | context.coordinator.renderer.display(pixelBuffer: buffer) |
| | | } |
| | | } |
| | | |
| | | class Coordinator { |
| | | let mtkView: MTKView |
| | | let renderer: MetalRenderer |
| | | |
| | | init() { |
| | | print("📦 MetalRendererWrapper 初始化了") |
| | | mtkView = MTKView() |
| | | renderer = MetalRenderer(mtkView: mtkView) |
| | | } |
| | | } |
| | | } |
| | | |