From e21b1c797955a231f2bcf71818e0259fbb6aeba1 Mon Sep 17 00:00:00 2001
From: Runt <qingingrunt2010@qq.com>
Date: Fri, 27 Jun 2025 15:57:25 +0000
Subject: [PATCH] 相机权限

---
 LiveProject/activity/stream/LiveActivity.swift |   76 ++++++++++++++++++++++++--------------
 1 files changed, 48 insertions(+), 28 deletions(-)

diff --git a/LiveProject/activity/stream/LiveActivity.swift b/LiveProject/activity/stream/LiveActivity.swift
index 8f16308..ef284a2 100644
--- a/LiveProject/activity/stream/LiveActivity.swift
+++ b/LiveProject/activity/stream/LiveActivity.swift
@@ -5,9 +5,10 @@
 //  Created by 倪路朋 on 6/25/25.
 //
 
-import Foundation
+import UIKit
+import AVFoundation
 import SwiftUI
-import WrappingHStack
+import MetalKit
 
 struct LiveActivity: View {
     @State private var pixelBuffer: CVPixelBuffer?
@@ -16,18 +17,24 @@
     @State private var showDeviceDialog = false
     
     @State private var streamRate = Float(9/16.0);
+    @State private var fpsState = 30;
     @State private var mainSize: CGSize = .init(width: 100, height: 100)
     
-    @State private var devices = [DeviceInfo(name: "相机", type: .CAMERA(), deviceId: "相机"),
-                                  DeviceInfo(name: "话筒", type: .MICROPHONE(),deviceId: "话筒"),
-                                  DeviceInfo(name: "系统", type: .SYSTEM(),deviceId : "系统")]
+    @State private var displaySize : CGSize = .zero;
+    
+    @State private var devices = [DeviceInfo(name: "相机", type: .CAMERA, deviceId: UUID().uuidString,icon: IconCamera()),
+                                  DeviceInfo(name: "话筒", type: .MICROPHONE,deviceId: UUID().uuidString,icon: IconMic()),
+                                  DeviceInfo(name: "系统", type: .SYSTEM,deviceId : UUID().uuidString,icon: IconPortrait())]
+
+    
+    private let mViewModel = LiveViewModel()
     
     var body: some View {
         ZStack{
             Color.clear
                 .ignoresSafeArea() // 填满全屏
             VStack{
-                VideoRendererView(renderer: MetalRenderer()).background(Color.black).frame(width: mainSize.width,height:mainSize.height)
+                VideoRendererView(renderer:mViewModel.renderer).background(Color.black).frame(width: mainSize.width,height:mainSize.height)
                 Spacer()
             }.border(Color.blue)
             VStack{
@@ -42,10 +49,14 @@
                 GeometryReader { geometry in
                     Color.clear
                         .onAppear {
-                            updateWindowSize(width: Int(geometry.size.width), height: Int(geometry.size.height))
+                            displaySize = geometry.size;
+                            updateWindowSize()
+                            print("displaySize:\(displaySize)")
                         }
                         .onChange(of: geometry.size) { newSize in
-                            updateWindowSize(width: Int(newSize.width), height: Int(newSize.height))
+                            displaySize = newSize;
+                            updateWindowSize()
+                            print("displaySize:\(displaySize)")
                         }
                 })
             .border(Color.red)
@@ -57,35 +68,35 @@
             }
     }
     
-    func updateWindowSize(width:Int,height:Int){
-        var rate : Float = Float(width)/Float(height);
+    func updateWindowSize(){
+        var rate : Float = Float(displaySize.width)/Float(displaySize.height);
         if(rate != streamRate) {
-            var mainWidth = 0;
-            var mainHeight = 0;
+            var mainWidth = 0.0;
+            var mainHeight = 0.0;
             if(rate < streamRate){
-                mainWidth = width;
+                mainWidth = displaySize.width;
                 if(9.0/16 == streamRate){
-                    mainHeight = (mainWidth / 9 * 16);
+                    mainHeight = (mainWidth / 9.0 * 16);
                 }else{
-                    mainHeight = (mainWidth / 16 * 9);
+                    mainHeight = (mainWidth / 16.0 * 9);
                 }
             }else{
-                mainHeight = height;
+                mainHeight = displaySize.height;
                 if(9.0 / 16 == streamRate){
-                    mainWidth = (mainHeight / 16 * 9);
+                    mainWidth = (mainHeight / 16.0 * 9);
                 }else{
-                    mainWidth = (mainHeight / 9 * 16);
+                    mainWidth = (mainHeight / 9.0 * 16);
                 }
             }
             if(mainSize.width != CGFloat(mainWidth) || mainSize.height != CGFloat(mainHeight)){
                 mainSize = .init(width: mainWidth, height: mainHeight);
             }
         }else{
-            if(mainSize.width != CGFloat(width) || mainSize.height != CGFloat(height)){
-                mainSize = .init(width: width, height: height);
+            if(mainSize.width != displaySize.width || mainSize.height != displaySize.height){
+                mainSize = .init(width: displaySize.width, height: displaySize.height);
             }
         }
-        //Log.w(TAG , "onSizeChanged: ${mainWindowSize.value}" , )
+        print("updateWindow:\(mainSize)")
     }
     
     func DialogDevices() -> some View{
@@ -102,12 +113,16 @@
                 VStack(spacing: 20) {
                     Spacer().frame(height:40)
                     FlowLayout(devices){ device in
-                        MButton(text:device.name){
-                            
+                        MButton(icon: device.icon,text: device.name){
+                            mViewModel.newWindowAction(device: device){ status in
+                                withAnimation{
+                                    showDeviceDialog = false;
+                                }
+                            }
+                            print("\(device.name) click")
                         }
                     }
                     .padding()
-                    .animation(.default, value: devices)
                 }
                 .frame(maxWidth: .infinity)
                 .padding()
@@ -116,6 +131,7 @@
                 .transition(.move(edge: .bottom))
             }
             .zIndex(1)
+            .animation(.default, value: devices)
         }
     }
     
@@ -123,12 +139,16 @@
         VStack{
         
             HStack(){
-                MButton(icon: IconPortrait()){
-                    
+                //横竖屏控制
+                MButton(icon:streamRate == (9/16.0) ? IconPortrait() : IconLandscape() ){
+                    streamRate = streamRate == (9/16.0) ? (16/9.0) : (9/16.0)
+                    updateWindowSize()
                 }
-                MButton(text: "30帧"){
-                    
+                // fps 控制
+                MButton(text: "\(fpsState)帧"){
+                    fpsState = fpsState == 30 ? 60 : 30;
                 }
+                //添加推流地址
                 MButton(valid: .INVALID,text: "+"){
                     
                 }

--
Gitblit v1.9.1