无法使用 AVCapturePhotoOutput 捕捉照片 swift + xcode [英] Unable to use AVCapturePhotoOutput to capture photo swift + xcode

查看:22
本文介绍了无法使用 AVCapturePhotoOutput 捕捉照片 swift + xcode的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个自定义相机应用程序,本教程使用 AVCaptureStillImageOutput,它在 ios 10 中已被弃用.我已经设置了相机,现在被困在如何拍摄照片上

I am working on a custom camera app and the tutorial uses AVCaptureStillImageOutput, which is deprecated for ios 10. I have set up the camera and am now stuck on how to take the photo

这是我拿着相机的全貌

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()

        }        }
}
}

这是我需要帮助的地方

@IBAction func clickCapture(_ sender: UIButton) {

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

我已经在这里回答了如何使用 AVCapturePhotoOutput但我不明白如何将该代码合并到此代码中,因为它涉及声明一个新类

I have gone through the answer here How to use AVCapturePhotoOutput but i do not understand how to incorporate that code in this code, as it involves declaring a new class

推荐答案

你就快到了.

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

Check out AVCapturePhotoOutput documentation for more help.

这些是拍摄照片的步骤.

These are the steps to capture a photo.

  1. 创建一个 AVCapturePhotoOutput 对象.使用它的属性来确定支持的捕获设置并启用某些功能(例如,是否捕获实时照片).
  2. 创建并配置一个 AVCapturePhotoSettings 对象以供选择特定捕获的功能和设置(例如,是否以启用图像稳定或闪光灯).
  3. 通过将您的照片设置对象传递给capturePhoto(with:delegate:) 方法和委托对象实现 AVCapturePhotoCaptureDelegate 协议.照片捕获输出然后调用您的委托通知您重要的捕获过程中的事件.
  1. Create an AVCapturePhotoOutput object. Use its properties to determine supported capture settings and to enable certain features (for example, whether to capture Live Photos).
  2. Create and configure an AVCapturePhotoSettings object to choose features and settings for a specific capture (for example, whether to enable image stabilization or flash).
  3. Capture an image by passing your photo settings object to the capturePhoto(with:delegate:) method along with a delegate object implementing the AVCapturePhotoCaptureDelegate protocol. The photo capture output then calls your delegate to notify you of significant events during the capture process.

在您的 clickCapture 方法中包含以下代码,不要忘记确认并实现在您的类中委托.

have this below code on your clickCapture method and don't forgot to confirm and implement to delegate in your class.

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)

<小时>

输出为 AVCaptureStillImageOutput

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


For Output as AVCaptureStillImageOutput

if you intend to snap a photo from video connection. you can follow the below steps.

步骤 1:获取连接

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

第 2 步:拍摄照片

  • 调用 captureStillImageAsynchronouslyFromConnection 函数stillImageOutput.
  • sampleBuffer 表示捕获的数据.
  • Call the captureStillImageAsynchronouslyFromConnection function on the stillImageOutput.
  • The sampleBuffer represents the data that is captured.
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
})

第 3 步:处理图像数据

  • 我们需要采取一些步骤来处理在 sampleBuffer 中找到的图像数据,以便最终得到一个 UIImage,我们可以将其插入我们的 captureImageView 并轻松地在我们应用的其他地方使用.
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...
}

第 4 步:保存图像

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

Based on your need either save the image to photos gallery or show that in a image view

有关详细信息,请查看创建自定义相机视图指南Snap a Photo

For more details check out Create custom camera view guide under Snap a Photo

这篇关于无法使用 AVCapturePhotoOutput 捕捉照片 swift + xcode的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆