【问题标题】:Preview doesn't show up (AVCaptureVideoPreviewLayer)预览不显示 (AVCaptureVideoPreviewLayer)
【发布时间】:2018-09-22 22:37:41
【问题描述】:

我试图首先让我的应用程序显示广角相机的相机预览。 但我所做的只是没有出现。 (该应用具有视频和音频权限,正在 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)
    }
}

我做错了什么? 我真的想不通,它可能只是一些愚蠢的小东西。

谢谢。

【问题讨论】:

    标签: ios swift video avfoundation video-capture


    【解决方案1】:

    在需要时尝试更新图层框架,并使用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
    }
    

    【讨论】:

    • 这个新的 __previewLayer 变量有什么用?
    • @Bruce 您需要保留对该特定层的引用才能访问它,以便在包含它的 UIView 更改几何图形时能够调整它的大小。当 viewDidLoad() 被调用并不意味着它已经有几何图形可以显示。
    猜你喜欢
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 2016-07-26
    • 2019-05-15
    • 1970-01-01
    • 2012-10-14
    相关资源
    最近更新 更多