无法使用AVCapturePhotoOutput捕获照片swift + xcode

use*_*284 3 xcode avfoundation ios swift swift3

我正在开发一个自定义相机应用程序,该教程使用了AVCaptureStillImageOutput,这是ios 10不推荐使用的.我已经设置了相机,现在我不知道如何拍摄照片

这是我的全景,我有相机

import UIKit
import AVFoundation

var cameraPos = "back"

class View3: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate {


@IBOutlet weak var clickButton: UIButton!
@IBOutlet var cameraView: UIView!
var session: AVCaptureSession?
var stillImageOutput: AVCapturePhotoOutput?
var videoPreviewLayer: AVCaptureVideoPreviewLayer?

override func viewDidLoad() {
    super.viewDidLoad()        
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    clickButton.center.x = cameraView.bounds.width/2
    loadCamera()
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
 }

@IBAction func clickCapture(_ sender: UIButton) {

    if let videoConnection = stillImageOutput!.connection(withMediaType: AVMediaTypeVideo) {
       // This is where I need help 
        }
}

@IBAction func changeDevice(_ sender: UIButton) {
    if cameraPos == "back"
    {cameraPos = "front"}

    else
    {cameraPos = "back"}


    loadCamera()
}

func loadCamera()
{
    session?.stopRunning()
    videoPreviewLayer?.removeFromSuperlayer()

    session = AVCaptureSession()
    session!.sessionPreset = AVCaptureSessionPresetPhoto

    var backCamera = AVCaptureDevice.defaultDevice(withDeviceType: .builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: .front)

    if cameraPos == "back"
    {
        backCamera = AVCaptureDevice.defaultDevice(withDeviceType: .builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: .back)
    }

    var error: NSError?
    var input: AVCaptureDeviceInput!
    do {
        input = try AVCaptureDeviceInput(device: backCamera)
    } catch let error1 as NSError {
        error = error1
        input = nil
        print(error!.localizedDescription)
    }

    if error == nil && session!.canAddInput(input) {
        session!.addInput(input)

        stillImageOutput = AVCapturePhotoOutput()

if session!.canAddOutput(stillImageOutput) {
            session!.addOutput(stillImageOutput)
            videoPreviewLayer = AVCaptureVideoPreviewLayer(session: session)
            videoPreviewLayer?.frame = cameraView.bounds
            videoPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
            videoPreviewLayer?.connection.videoOrientation = AVCaptureVideoOrientation.portrait

            cameraView.layer.addSublayer(videoPreviewLayer!)
            session!.startRunning()

        }        }
}
}
Run Code Online (Sandbox Code Playgroud)

这是我需要帮助的地方

@IBAction func clickCapture(_ sender: UIButton) {

if let videoConnection = stillImageOutput!.connection(withMediaType: AVMediaTypeVideo) {
   // This is where I need help 
    }
}
Run Code Online (Sandbox Code Playgroud)

我在这里找到了答案如何使用AVCapturePhotoOutput 但我不明白如何在此代码中包含该代码,因为它涉及声明一个新类

Blu*_*ngs 5

你快到了.

输出为 AVCapturePhotoOutput

查看AVCapturePhotoOutput 文档以获取更多帮助.

这些是捕获照片的步骤.

  1. 创建一个AVCapturePhotoOutput对象.使用其属性确定支持的捕获设置并启用某些功能(例如,是否捕获实时照片).
  2. 创建和配置AVCapturePhotoSettings对象以选择特定捕获的功能和设置(例如,是否启用图像稳定或闪存).
  3. 通过将照片设置对象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)
Run Code Online (Sandbox Code Playgroud)

输出为 AVCaptureStillImageOutput

如果您打算从视频连接中拍摄照片.您可以按照以下步骤操作.

第1步:获取连接

if let videoConnection = stillImageOutput!.connectionWithMediaType(AVMediaTypeVideo) {
  // ...
  // Code for photo capture goes here...
}
Run Code Online (Sandbox Code Playgroud)

第2步:拍摄照片

  • 调用该captureStillImageAsynchronouslyFromConnection函数stillImageOutput.
  • sampleBuffer表示被捕捉的数据.

stillImageOutput?.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler: { (sampleBuffer, error) -> Void in
  // ...
  // Process the image data (sampleBuffer) here to get an image file we can put in our captureImageView
})
Run Code Online (Sandbox Code Playgroud)

第3步:处理图像数据

  • 我们需要采取一些步骤来处理sampleBuffer中的图像数据,以便最终得到一个UIImage,我们可以将其插入到captureImageView中,并轻松地在我们的app中的其他地方使用.

if sampleBuffer != nil {
  let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer)
  let dataProvider = CGDataProviderCreateWithCFData(imageData)
  let cgImageRef = CGImageCreateWithJPEGDataProvider(dataProvider, nil, true, CGColorRenderingIntent.RenderingIntentDefault)
  let image = UIImage(CGImage: cgImageRef!, scale: 1.0, orientation: UIImageOrientation.Right)
  // ...
  // Add the image to captureImageView here...
}
Run Code Online (Sandbox Code Playgroud)

第4步:保存图像

根据您的需要将图像保存到照片库或在图像视图中显示


有关详细信息,请查看" 拍摄照片"下的" 创建自定义相机视图指南 "