我的自定义相机视图有什么问题?

时间:2018-12-09 03:33:27

标签: swift xcode camera avfoundation

我遵循了以下视频: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 :(得分:1)

我运行了您的代码,它运行得很好-差不多了!唯一的问题是,我必须在应用程序的 Info.plist 中添加“隐私-相机使用说明”条目。否则,应用程序将崩溃。

这样做并运行您的代码后,就可以在设备上看到实时摄像机视图。

那为什么对您不起作用?让我们考虑一些可能的原因。您没有提供足够的信息来肯定知道(因为代码本身可以正常工作),但是这里有一些可能性:

  • 您在应用程序的 Info.plist 中没有“隐私-相机使用说明”条目。

  • 您正在模拟器上进行测试。也许这段代码仅在设备上有效。

  • 在您说insertSublayer时,您在子层的 front 中添加了一些内容。要对此进行测试,请尝试改为说addSublayer;这将使相机层成为最顶层(请记住,这只是出于测试目的)。

  • 也许您的代码根本不会运行?也许我们从来没有真正去过这个视图控制器。要检验该理论,请在您的print中放置一个viewDidLoad语句,看看它是否实际打印到控制台上。

  • 也许您的代码运行得太早了?为了检验该理论,请将所有这些调用从viewDidLoad中移出,然后移至诸如viewDidAppear之类的位置。请记住,这只是出于测试目的。

希望其中之一可以帮助您找出问题所在。