Предварительный просмотр не отображается (AVCaptureVideoPreviewLayer) - PullRequest
0 голосов
/ 23 сентября 2018

Сначала я пытаюсь заставить мое приложение показывать предварительный просмотр широкоугольной камеры.Но то, что я делаю, просто не появляется.(приложение имеет разрешение на видео и аудио и тестируется на 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 Ответ

0 голосов
/ 23 сентября 2018

Попробуйте обновить фрейм слоя, когда это необходимо, и используйте 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...