Runt
2025-06-27 e21b1c797955a231f2bcf71818e0259fbb6aeba1
LiveProject/views/VideoRendererView.swift
@@ -7,57 +7,20 @@
import SwiftUI
import MetalKit
struct MetalVideoRenderView: UIViewRepresentable {
    // 统一接口,接收各种视频源的帧数据
    var frameData: VideoFrameData?
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
struct VideoRendererView: UIViewRepresentable {
    let renderer: MetalRenderer  // 自定义 Metal 渲染器,支持传入 RGBA/YUV 数据帧
    func makeUIView(context: Context) -> MTKView {
        let mtkView = MTKView()
        mtkView.device = context.coordinator.device
        mtkView.delegate = context.coordinator
        mtkView.framebufferOnly = false
        mtkView.colorPixelFormat = .bgra8Unorm
        mtkView.autoResizeDrawable = true
        return 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
    }
    func updateUIView(_ uiView: MTKView, context: Context) {
        // 更新帧数据
        context.coordinator.updateFrame(frameData)
    }
    class Coordinator: NSObject, MTKViewDelegate {
        var parent: MetalVideoRenderView
        var device: MTLDevice
        var commandQueue: MTLCommandQueue
        var pipelineState: MTLRenderPipelineState
        var textureCache: CVMetalTextureCache?
        // YUV转RGB的着色器
        var yuvConversionPipeline: MTLComputePipelineState?
        init(_ parent: MetalVideoRenderView) {
            self.parent = parent
            self.device = MTLCreateSystemDefaultDevice()!
            self.commandQueue = device.makeCommandQueue()!
            // 初始化Metal资源
            // (这里需要设置渲染管线和纹理缓存)
        }
        func updateFrame(_ frameData: VideoFrameData?) {
            // 根据不同的帧数据格式(YUV/RGBA)进行处理
            // 将数据转换为Metal纹理
        }
        func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {}
        func draw(in view: MTKView) {
            // 执行Metal绘制命令
        }
    }
    func updateUIView(_ uiView: MTKView, context: Context) {}
}