Что не так с моим пользовательским обзором камеры? - PullRequest
0 голосов
/ 09 декабря 2018

Я следовал за этим видео: https://www.youtube.com/watch?v=7TqXrMnfJy8&t=45s до T. Но когда я открываю вид из камеры, все, что я вижу, это черный экран и белая кнопка.Я не получаю сообщений об ошибках при попытке загрузить вид с камеры.Может кто-нибудь помочь мне с тем, что я делаю неправильно?

Мой код указан ниже:

import UIKit
import AVFoundation

class CameraViewController: UIViewController {

var captureSession = AVCaptureSession()
var backCamera: AVCaptureDevice?
var currentCamera: AVCaptureDevice?

var photoOutput: AVCapturePhotoOutput?

var cameraPreviewLayer: AVCaptureVideoPreviewLayer?

override func viewDidLoad() {
    super.viewDidLoad()

    setupCaptureSession()
    setupDevice()
    setupInputOutput()
    setupPreviewLayer()
    startRunningCaptureSession()

}

func setupCaptureSession(){
    captureSession.sessionPreset = AVCaptureSession.Preset.photo
}
func setupDevice(){
    let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [AVCaptureDevice.DeviceType.builtInWideAngleCamera], mediaType: AVMediaType.video, position: AVCaptureDevice.Position.unspecified)
    let devices = deviceDiscoverySession.devices

    for device in devices{
        if device.position == AVCaptureDevice.Position.back {
            backCamera = device
        }
    }

    currentCamera = backCamera
}

func setupInputOutput(){

    do {
        let captureDeviceInput = try AVCaptureDeviceInput(device: currentCamera!)
        captureSession.addInput(captureDeviceInput)
        photoOutput?.setPreparedPhotoSettingsArray([AVCapturePhotoSettings(format:[AVVideoCodecKey: AVVideoCodecType.jpeg])], completionHandler: nil)
    } catch {
        print(error)
    }

}

func setupPreviewLayer(){
    cameraPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
    cameraPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
    cameraPreviewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
    cameraPreviewLayer?.frame = self.view.frame
    self.view.layer.insertSublayer(cameraPreviewLayer!, at: 1)
}

func startRunningCaptureSession(){
    captureSession.startRunning()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated
}
}

1 Ответ

0 голосов
/ 09 декабря 2018

Я запустил ваш код, и он работал отлично - почти!Единственная проблема заключается в том, что мне пришлось добавить запись «Конфиденциальность - описание использования камеры» в Info.plist приложения.В противном случае приложение вылетает.

Как только я это сделал и запустил ваш код, я увидел изображение с камеры в реальном времени на своем устройстве.

Так почему же это не работает для вас?Давайте подумаем о некоторых возможных причинах.Вы не дали достаточно информации, чтобы знать наверняка (учитывая, что сам код работает просто отлично), но вот некоторые возможности:

  • У вас нет конфиденциальности - Использование камерыЗапись описания в Info.plist приложения .

  • Вы тестируете на симуляторе.Возможно, этот код работает только на устройстве.

  • В вашем интерфейсе есть что-то в перед подслоя, которое вы добавляете, когда говорите insertSublayer.Чтобы проверить это, попробуйте сказать addSublayer вместо этого;это сделает слой камеры самым передним слоем (помните, это только для целей тестирования).

  • Может быть, ваш код вообще никогда не запускается?Возможно, мы никогда не пойдем к этому контроллеру представления.Чтобы проверить эту теорию, поместите оператор print в viewDidLoad и посмотрите, действительно ли он печатается на консоли.

  • Может быть, ваш код запускается слишком рано?Чтобы проверить эту теорию, переместите все эти вызовы из viewDidLoad в нечто более позднее, например viewDidAppear.Помните, что это только для целей тестирования.

Надеюсь, один из них поможет вам выяснить, в чем проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...