From 5e101b6d445d9bbff119d308c454c55d0a03de14 Mon Sep 17 00:00:00 2001 From: Runt <qingingrunt2010@qq.com> Date: Fri, 27 Jun 2025 05:29:28 +0000 Subject: [PATCH] 主窗口 设备列表弹框 底部弹框 自动换行view --- LiveProject/views/VideoRendererView.swift | 63 +++++++++++++++ LiveProject/views/FlowLayout.swift | 7 + LiveProject/enum/StreamType.swift | 0 LiveProject/shape/IconBack.swift | 8 ++ LiveProject/tool/MetalRenderer.swift | 78 +++++++++++++++++++ LiveProject/views/TitleBarView.swift | 44 +++++++++++ LiveProject/data/DeviceInfo.swift | 0 7 files changed, 200 insertions(+), 0 deletions(-) diff --git a/LiveProject/data/DeviceInfo.swift b/LiveProject/data/DeviceInfo.swift new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/LiveProject/data/DeviceInfo.swift diff --git a/LiveProject/enum/StreamType.swift b/LiveProject/enum/StreamType.swift new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/LiveProject/enum/StreamType.swift diff --git a/LiveProject/shape/IconBack.swift b/LiveProject/shape/IconBack.swift new file mode 100644 index 0000000..0856c3b --- /dev/null +++ b/LiveProject/shape/IconBack.swift @@ -0,0 +1,8 @@ +// +// IconBack.swift +// LiveProject +// +// Created by 倪路朋 on 6/26/25. +// + +import Foundation diff --git a/LiveProject/tool/MetalRenderer.swift b/LiveProject/tool/MetalRenderer.swift new file mode 100644 index 0000000..3e88871 --- /dev/null +++ b/LiveProject/tool/MetalRenderer.swift @@ -0,0 +1,78 @@ +// +// Renderer.swift +// LiveProject +// 渲染工具 +// Created by 倪路朋 on 6/26/25. +// +import Metal +import MetalKit + +class Renderer: NSObject, MTKViewDelegate { + static var shared: Renderer? + + private var device: MTLDevice! + private var commandQueue: MTLCommandQueue! + private var pipelineState: MTLRenderPipelineState! + private var texture: MTLTexture? + private var textureDescriptor: MTLTextureDescriptor! + private var currentData: [UInt8]? + private var textureWidth = 0 + private var textureHeight = 0 + + weak var mtkView: MTKView? { + didSet { + guard let view = mtkView else { return } + device = view.device + commandQueue = device.makeCommandQueue() + + let library = device.makeDefaultLibrary() + let pipelineDesc = MTLRenderPipelineDescriptor() + pipelineDesc.vertexFunction = library?.makeFunction(name: "vertexShader") + pipelineDesc.fragmentFunction = library?.makeFunction(name: "fragmentShader") + pipelineDesc.colorAttachments[0].pixelFormat = view.colorPixelFormat + + pipelineState = try? device.makeRenderPipelineState(descriptor: pipelineDesc) + + Renderer.shared = self + } + } + + func updateFrame(data: [UInt8], width: Int, height: Int) { + currentData = data + textureWidth = width + textureHeight = height + } + + func draw(in view: MTKView) { + guard let drawable = view.currentDrawable, + let descriptor = view.currentRenderPassDescriptor, + let data = currentData else { return } + + if texture == nil || texture?.width != textureWidth || texture?.height != textureHeight { + textureDescriptor = MTLTextureDescriptor.texture2DDescriptor( + pixelFormat: .rgba8Unorm, + width: textureWidth, + height: textureHeight, + mipmapped: false + ) + textureDescriptor.usage = [.shaderRead, .shaderWrite] + texture = device.makeTexture(descriptor: textureDescriptor) + } + + let region = MTLRegionMake2D(0, 0, textureWidth, textureHeight) + data.withUnsafeBytes { ptr in + texture?.replace(region: region, mipmapLevel: 0, withBytes: ptr.baseAddress!, bytesPerRow: textureWidth * 4) + } + + let commandBuffer = commandQueue.makeCommandBuffer() + let encoder = commandBuffer?.makeRenderCommandEncoder(descriptor: descriptor) + encoder?.setRenderPipelineState(pipelineState) + encoder?.setFragmentTexture(texture, index: 0) + encoder?.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: 4) + encoder?.endEncoding() + commandBuffer?.present(drawable) + commandBuffer?.commit() + } + + func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} +} diff --git a/LiveProject/views/FlowLayout.swift b/LiveProject/views/FlowLayout.swift new file mode 100644 index 0000000..f3ee86a --- /dev/null +++ b/LiveProject/views/FlowLayout.swift @@ -0,0 +1,7 @@ +// +// Untitled.swift +// LiveProject +// +// Created by 倪路朋 on 6/26/25. +// + diff --git a/LiveProject/views/TitleBarView.swift b/LiveProject/views/TitleBarView.swift new file mode 100644 index 0000000..a58fd40 --- /dev/null +++ b/LiveProject/views/TitleBarView.swift @@ -0,0 +1,44 @@ +// +// TitleBarView.swift +// aones +// +// Created by 倪路朋 on 2/16/23. +// + +import SwiftUI + +struct TitleBarView: View { + + @Environment(\.presentationMode) var presentationMode + + var title = "" + var imgLeft = "IconBack"; + var imgRight = ""; + var titleColor = "ColorText" + + var body: some View { + + HStack(spacing: 0){ + Spacer().frame(width: 16) + Button(action: { + print("Click back button") + self.presentationMode.wrappedValue.dismiss() + }) { + Image(imgLeft) + .frame(width: 28,height: 28) + } + Spacer() + Text(title).foregroundColor(Color.init(titleColor)) + .bold().font(Font.system(size: 16)) + Spacer() + Image(imgRight).frame(width: 28,height: 28) + Spacer().frame(width: 16) + }.frame(height: 48) + } +} + +struct TitleBarView_Previews: PreviewProvider { + static var previews: some View { + TitleBarView(title: "标题") + } +} diff --git a/LiveProject/views/VideoRendererView.swift b/LiveProject/views/VideoRendererView.swift new file mode 100644 index 0000000..960aa78 --- /dev/null +++ b/LiveProject/views/VideoRendererView.swift @@ -0,0 +1,63 @@ +// +// MetalVideoView.swift +// LiveProject +// 视频绘制 +// Created by 倪路朋 on 6/26/25. +// +import SwiftUI +import MetalKit + +struct MetalVideoRenderView: UIViewRepresentable { + // 统一接口,接收各种视频源的帧数据 + var frameData: VideoFrameData? + + func makeCoordinator() -> Coordinator { + Coordinator(self) + } + + 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 + } + + 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绘制命令 + } + } +} -- Gitblit v1.9.1