| | |
| | | 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) {} |
| | | } |