2017-06-14 58 views
1

我正在尝试整合自定义摄像头视图,并遵循一些稍微过时的代码。我有一些错误,但我认为已经解决他们吧2.集成自定义摄像头视图AVCaptureDevice

这是迄今为止当前代码:

import Foundation 
import AVFoundation 
import UIKit 

class setupView : UIViewController { 

@IBOutlet var cameraView: UIView! 
@IBOutlet var nameTextField: UITextField! 

var captureSession = AVCaptureSession() 
var stillImageOutput = AVCapturePhotoOutput() 
var previewLayer = AVCaptureVideoPreviewLayer() 

override func viewDidLoad() { 

     let session = AVCaptureDeviceDiscoverySession.init(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: .back) 
    if let device = session?.devices[0] { 

     if device.position == AVCaptureDevicePosition.back { 

      do { 

       let input = try AVCaptureDeviceInput(device: device) 
       if captureSession.canAddInput(input){ 
        captureSession.addInput(input) 
        stillImageOutput.outputSettings = [AVVideoCodecKey : AVVideoCodecJPEG] 

        if captureSession.canAddOutput(stillImageOutput) { 
         captureSession.addOutput(stillImageOutput) 
         captureSession.startRunning() 

         previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
         previewLayer.AVLayerVideoGravityResizeAspectFill 
         previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.portrait 
         cameraView.layer.addSublayer(previewLayer) 

         previewLayer.bounds = cameraView.frame 
         previewLayer.position = CGPoint(x: cameraView.frame.width/2, y:cameraView.frame.height/2) 

        } 

       } 

      }    catch { 



      } 
     } 
    } 

} 

@IBAction func takePhoto(_ sender: Any) { 
    } 

@IBAction func submitAction(_ sender: Any) { 

} 
} 

目前我得到2个错误:

“型AVCapturePhotoOutput的值“不具有成员‘outputSettings’

”的类型‘AVCaptureVideoPreviewLayer’值没有构件 ‘AVLayerVideoGravityResizeAspectFill’

+0

错误“类型AVCapturePhotoOutput价值”很清楚没有成员“outputSettings”被删除,如果我恢复到AVCaptureStillImageOutput,但是这已折旧。 –

回答

0
import AVFoundation 
    import Foundation 
    @IBOutlet weak var mainimage: UIImageView! 
    let captureSession = AVCaptureSession() 
    let stillImageOutput = AVCaptureStillImageOutput() 
    var previewLayer : AVCaptureVideoPreviewLayer? 
    var captureDevice : AVCaptureDevice? 
     override func viewDidLoad() { 
     super.viewDidLoad() 
      captureSession.sessionPreset = AVCaptureSessionPresetHigh 

      if let devices = AVCaptureDevice.devices() as? [AVCaptureDevice] { 
       // Loop through all the capture devices on this phone 
       for device in devices { 
        // Make sure this particular device supports video 
        if (device.hasMediaType(AVMediaTypeVideo)) { 
         // Finally check the position and confirm we've got the back camera 
         if(device.position == AVCaptureDevicePosition.front) { 
          captureDevice = device 
          if captureDevice != nil { 
           print("Capture device found") 
           beginSession() 
          } 
         } 
        } 
       } 
      } 


    } 



func beginSession() { 

     do { 
      try captureSession.addInput(AVCaptureDeviceInput(device: captureDevice)) 
      stillImageOutput.outputSettings = [AVVideoCodecKey:AVVideoCodecJPEG] 

      if captureSession.canAddOutput(stillImageOutput) { 
       captureSession.addOutput(stillImageOutput) 
      } 

     } 
     catch { 
      print("error: \(error.localizedDescription)") 
     } 

     guard let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) else { 
      print("no preview layer") 
      return 
     } 

     self.view.layer.addSublayer(previewLayer) 
     previewLayer.frame = self.view.layer.frame 
     captureSession.startRunning() 
     self.view.addSubview(mainimage) 

    } 

此代码工作在我的应用程序

1

你几乎没有。问题是一些AVFoundation类已被弃用,现在有多种方式拍摄照片。这是你的代码的问题。

“型AVCapturePhotoOutput价值”没有成员“outputSettings”

这是因为实际上AVCapturePhotoOutput没有定义为outputSettings任何成员。检查出的AVCapturePhotoOutput

其实outputSettingsdocumentationAVCaptureStillImageOutput成员,同样是来自iOS的10.0

“价值型 “AVCaptureVideoPreviewLayer弃用” 没有成员 “AVLayerVideoGravityResizeAspectFill”

同样的错误,根据你的代码,AVCaptureVideoPreviewLayer没有成员。如果你想设置视频预览层的设置如下。

previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 

像你提到的代码已经过时,其使用已过时AVCaptureStillImageOutput

如果真想用AVCapturePhotoOutput那么你应该遵循以下步骤。

这些是拍摄照片的步骤。

  • 创建一个AVCapturePhotoOutput对象。使用其属性确定支持的捕捉设置并启用某些功能(例如,是否捕捉实时照片)。
  • 创建并配置AVCapturePhotoSettings对象,以便为特定捕捉(例如,是否启用图像稳定或闪光灯)选择功能和设置。
  • 通过将您的照片设置对象传递给capturePhoto(with:delegate :)方法以及实现AVCapturePhotoCaptureDelegate协议的委托对象来捕获图像。照片捕捉输出然后调用您的委托在捕获过程中通知您重要事件。

有此下面的代码对你clickCapture方法,不要忘了确认,并实现你的类委托。

let settings = AVCapturePhotoSettings() 
let previewPixelType = settings.availablePreviewPhotoPixelFormatTypes.first! 
let previewFormat = [kCVPixelBufferPixelFormatTypeKey as String: previewPixelType, 
          kCVPixelBufferWidthKey as String: 160, 
          kCVPixelBufferHeightKey as String: 160, 
          ] 
settings.previewPhotoFormat = previewFormat 
self.cameraOutput.capturePhoto(with: settings, delegate: self) 

,如果你想在不同的方式知道从avfoundation拍摄的照片看看我以前的SO answer

也是苹果文档解释为How to use AVCapturePhotoOutput