代码之家  ›  专栏  ›  技术社区  ›  bcye

预览不显示(AVCaptureVideoPreviewLayer)

  •  0
  • bcye  · 技术社区  · 6 年前

    我想先让我的应用程序显示广角相机的相机预览。 但我所做的并没有出现。(该应用程序拥有视频和音频权限,目前正在iPhone 7 Plus上测试)

    以下是我的会话配置代码:

    func configureSession() throws {
        session.beginConfiguration()
    
        // configure inputs
        let videoDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)
        let audioDevice = AVCaptureDevice.default(.builtInMicrophone, for: .audio, position: .unspecified)
        guard let videoInput = try? AVCaptureDeviceInput(device: videoDevice!), let audioInput = try? AVCaptureDeviceInput(device: audioDevice!), session.canAddInput(videoInput), session.canAddInput(audioInput) else {
            throw CameraError.configurationFailed
        }
    
        // configure outputs
        let output = AVCaptureMovieFileOutput()
        let previewOutput = AVCaptureVideoDataOutput()
        previewOutput.alwaysDiscardsLateVideoFrames = true
        previewOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey as String : NSNumber(value: kCVPixelFormatType_32BGRA)]
        guard session.canAddOutput(output) && session.canAddOutput(previewOutput) else {
            throw CameraError.configurationFailed
        }
        session.sessionPreset = .high
        session.addOutput(output)
        session.addOutput(previewOutput)
    
        session.commitConfiguration()
    }
    

    这是 previewLayer

    // adds given view as previewView to the session
    func configureAsPreview(_ view: UIView) {
        let previewLayer = AVCaptureVideoPreviewLayer(session: session)
        view.layer.addSublayer(previewLayer)
        previewLayer.frame = view.layer.frame
    }
    

    它被叫来了 viewDidLoad :

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        if cameraManager.hasPermissionForVideo {
            try! cameraManager.configureSession()
            cameraManager.configureAsPreview(self.previewView)
            cameraManager.startSession()
        } else {
            performSegue(withIdentifier: "presentPermissions", sender: nil)
        }
    }
    

    我做错什么了?

    谢谢。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Modo Ltunzher    6 年前

    在需要时尝试更新层框架,并使用 bounds 而不是 frame

    private var __previewLayer = AVCaptureVideoPreviewLayer? = nil
    func configureAsPreview(_ view: UIView) {
        let previewLayer = AVCaptureVideoPreviewLayer(session: session)
        self.view.layer.addSublayer(previewLayer)
        previewLayer.frame = self.view.bounds
        self.__previewLayer = previewLayer
    }
    
    override viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        self.__previewLayer?.frame = self.view.bounds
    }