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