| | |
| | | import MetalKit |
| | | |
| | | struct VideoRendererView: UIViewRepresentable { |
| | | let renderer: MetalRenderer // 自定义 Metal 渲染器,支持传入 RGBA/YUV 数据帧 |
| | | @Binding var pixelBuffer: CVPixelBuffer? |
| | | |
| | | func makeUIView(context: Context) -> MTKView { |
| | | let mtkView = MTKView() |
| | | mtkView.device = MTLCreateSystemDefaultDevice() |
| | | mtkView.framebufferOnly = false |
| | | mtkView.enableSetNeedsDisplay = false |
| | | mtkView.isPaused = true |
| | | mtkView.delegate = renderer |
| | | renderer.setup(view: mtkView) |
| | | return mtkView |
| | | //用 Coordinator 缓存实例 |
| | | func makeCoordinator() -> Coordinator { |
| | | return Coordinator() |
| | | } |
| | | |
| | | func updateUIView(_ uiView: MTKView, context: Context) {} |
| | | func makeUIView(context: Context) -> MTKView { |
| | | return context.coordinator.mtkView |
| | | } |
| | | |
| | | 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) |
| | | } |
| | | } |
| | | } |
| | | |