From 2b51baa1981fb445b938e64bdce539e58fe70264 Mon Sep 17 00:00:00 2001 From: Runt <qingingrunt2010@qq.com> Date: Sat, 26 Jul 2025 13:17:14 +0000 Subject: [PATCH] 小窗缩放, 相机转小窗显示 小窗旋转,相机画面旋转 关闭按钮优化 --- LiveProject/views/VideoRendererView.swift | 71 +++++++++++++---------------------- 1 files changed, 27 insertions(+), 44 deletions(-) diff --git a/LiveProject/views/VideoRendererView.swift b/LiveProject/views/VideoRendererView.swift index 960aa78..79a63a1 100644 --- a/LiveProject/views/VideoRendererView.swift +++ b/LiveProject/views/VideoRendererView.swift @@ -7,57 +7,40 @@ import SwiftUI import MetalKit -struct MetalVideoRenderView: UIViewRepresentable { - // 统一接口,接收各种视频源的帧数据 - var frameData: VideoFrameData? - +struct VideoRendererView: UIViewRepresentable { + @Binding var pixelBuffer: CVPixelBuffer? + @Binding var rotate:Int?; + + //用 Coordinator 缓存实例 func makeCoordinator() -> Coordinator { - Coordinator(self) + return Coordinator() } - + 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 + return context.coordinator.mtkView } - + func updateUIView(_ uiView: MTKView, context: Context) { - // 更新帧数据 - context.coordinator.updateFrame(frameData) + if let buffer = pixelBuffer { + //print("updateUIView") + context.coordinator.renderer.display(pixelBuffer: buffer) + } + if let angle = rotate{ + //print("updateUIView rotate \(angle)") + context.coordinator.renderer.updateRotate(angle: angle) + } } - 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绘制命令 + + class Coordinator { + let mtkView: MTKView + let renderer: MetalRenderer + + init() { + print("📦 MetalRendererWrapper 初始化了") + mtkView = MTKView() + renderer = MetalRenderer(mtkView: mtkView) } } } + -- Gitblit v1.9.1