AVFoundation SwiftUI - 只是一个白屏

问题描述 投票:0回答:1

几周来我一直在尝试创建自定义相机。一直在尝试不同的教程,但似乎没有任何效果。现在我觉得我有一个很好的代码结构,但在允许在我的物理设备上使用相机后,我最终只是看到一个白屏。有什么想法可能是什么问题吗?

这是我的代码:

import SwiftUI
import FirebaseCore

@main
struct FirebaseAuthYoutubeApp: App {
    @StateObject var viewModal = AuthViewModel()
    
    init() {
        FirebaseApp.configure()
    }
    
    
    var body: some Scene {
        WindowGroup {
           /* ContentView()
                .environmentObject(viewModal)
       */
            CameraView2()
        }
        
    }
}
import SwiftUI
import AVFoundation
import UIKit


struct CamerVIEW2Kavsoft: View {
    var body: some View {
        Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
    }
}

struct CamerVIEW2Kavsoft_Previews: PreviewProvider {
    static var previews: some View {
        CameraView2()
    }
}

struct CameraView2: View {
    @StateObject var camera = cameraModel()
    var body: some View{
        ZStack{
            
            //Going to be the camera preview...
            CameraPreview(camera: camera)
                .ignoresSafeArea(.all, edges: .all)
            
            VStack{
                
                if camera.isTaken {
                    
                    HStack{
                        Spacer()
                        Button(action: camera.retaTake, label: {
                            Image(systemName: "arrow.triangle.2.circlepath.camera")
                                .foregroundColor(.black)
                                .padding()
                                .background(Color.white)
                                .clipShape(Circle())
                        })
                        .padding(.trailing,10)
                        
                    }
                }
                
                Spacer()
                
                HStack {
                    
                   
                    // if taken showing save and again take button
                    
                    if camera.isTaken {
                        
                        Button(action: {if !camera.isSaved{camera.savePic()}}, label: {
                            Text(camera.isSaved ? "Saved" : "Save")
                            .foregroundColor(.black)
                            .fontWeight(.semibold)
                            .padding(.vertical,10)
                            .padding(.horizontal,20)
                            .background(Color.white)
                            .clipShape(Capsule())
                               
                               })
                        .padding(.leading)
                        Spacer()
                        
                    } else {
                        
                        Button(action: {camera.takePic()}, label: {
                            
                            ZStack{
                                
                                Circle()
                                    .fill(Color.white)
                                    .frame(width: 65, height: 65)
                                
                                Circle()
                                    .stroke(Color.white, lineWidth: 2)
                                    .frame(width: 75, height: 75)
                            }
                            
                        })
                    }
                }
                .frame(height: 75)
            }
        }
        .onAppear(perform: {
            camera.Check()
        })
    }
}


//Camera Model...

class cameraModel: NSObject, ObservableObject,  AVCapturePhotoCaptureDelegate {
    @Published var isTaken = false
    @Published var session = AVCaptureSession()
    @Published var alert = false
    
    // Since wew going to read pic data...
    @Published var output = AVCapturePhotoOutput()
    
    // preview
    @Published var preview : AVCaptureVideoPreviewLayer!
    
    @Published var isSaved = false
    @Published var picData = Data(count: 0)
    
    
    func Check() {
        //first checking cameras got permission..
        switch AVCaptureDevice.authorizationStatus(for:  .video) {
        case .authorized:
            //setting up session
            setUp()
            return
        case .notDetermined:
            // retesting for permission...
            AVCaptureDevice.requestAccess(for: .video) { (status) in
                if status {
                    self.setUp()
                }
            }
            
        case .denied:
            self.alert.toggle()
            return
        default:
            return
            
        }
        
    }
    
    func setUp() {
        // setting up camera
        
        do {
            
            // setting configs..
            self.session.beginConfiguration()
            
            if let device = AVCaptureDevice.default(.builtInDualCamera, for: .video, position: .back) {
                
                do {
                    let input = try AVCaptureDeviceInput(device: device)
                    
                    //checking and adding to session
                    
                    if self.session.canAddInput(input) {
                        self.session.addInput(input)
                    }
                } catch {
                    print(error.localizedDescription)
                }
                
                // Same for outputs...
                
                if self.session.canAddOutput(self.output) {
                    self.session.addOutput(self.output)
                }
                
                self.session.commitConfiguration()
            }
        }catch {
                print(error.localizedDescription)
            }
        }
        
        // take and retake functions...
        
        func takePic(){
            DispatchQueue.global(qos: .background).async {
                self.output.capturePhoto(with: AVCapturePhotoSettings(), delegate: self)
                self.session.stopRunning()
                
                DispatchQueue.main.async {
                    withAnimation{self.isTaken.toggle()}
                    // clearing
                    self.isSaved = false
                }
            }
        }
        
        func retaTake() {
            DispatchQueue.global(qos: .background).async {
                self.session.startRunning()
                
                DispatchQueue.main.async {
                    withAnimation{self.isTaken.toggle()}
                }
            }
        }
        
        
        func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
            if error != nil{
                return
            }
            
            print("pic taken...")
            
            guard let imageData = photo.fileDataRepresentation() else {return}
            self.picData = imageData
        }
        
        func savePic() {
            let image = UIImage(data: self.picData)!
            
            // saving Image...
            UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
            self.isSaved = true
            
            print("saved succeded ")
        }
    }
    
    //Setting view for preview...
    
    
    struct CameraPreview: UIViewRepresentable {
        
        @ObservedObject var camera : cameraModel
        func makeUIView(context: Context) -> UIView {
            
            let view = UIView(frame: UIScreen.main.bounds)
            
            camera.preview = AVCaptureVideoPreviewLayer(session: camera.session)
            camera.preview.frame = view.frame
            
            // Your own properties...
            
            camera.preview.videoGravity = .resizeAspectFill
            view.layer.addSublayer(camera.preview)
            
            //starting session
            camera.session.startRunning()
            
            return view
        }
        
        func updateUIView(_ uiView: UIView, context: Context) {
            
        }
    }
    
    

这是我的权限 info.plist 设置:

早些时候,我在 setUp 函数中的

let
input =
try
 AVCaptureDeviceInput(device: device)
行上遇到了致命错误,因此我尝试使用可选绑定,但没有成功。

swift swiftui camera uikit avfoundation
1个回答
0
投票

所以我解决了问题,在我的设置方法中,我在这条线上调用了错误的相机

if let device = AVCaptureDevice.default(.builtInDualCamera, for: .video, position: .back) {

本来应该是:

if let device = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back) {
© www.soinside.com 2019 - 2024. All rights reserved.