2017-01-29 3 views
0

В настоящее время я создаю простое приложение, которое использует AVFoundation для потокового видео в UIImageView.Захват неподвижного изображения с AVFoundation

Для достижения этой цели, я создал экземпляр AVCaptureSession() и AVCaptureSessionPreset():

let input = try AVCaptureDeviceInput(device: device) 
       print(input) 
       if (captureSession.canAddInput(input)) { 
        captureSession.addInput(input) 

        if (captureSession.canAddOutput(sessionOutput)) { 
         captureSession.addOutput(sessionOutput) 
         previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
         previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
         previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.portrait 

         cameraView.layer.addSublayer(previewLayer) 
         captureSession.startRunning() 

cameraView ссылки на UIImageView розетку.

Теперь я хочу реализовать способ захвата неподвижного изображения с AVCaptureSession.

Исправьте меня, если более эффективный способ, но я планирую иметь дополнительный UIImageView для хранения неподвижного изображения, размещенного поверх UIImageView, который содержит видео?

Я создал кнопку с действием:

@IBAction func takePhoto(_sender: Any) { 
    // functionality to obtain still image 
} 

Моя проблема, я не уверен в том, как на самом деле получить неподвижное изображение из сеанса захвата и заполнить новый UIImageView с ним.

После просмотра информации/вопросы размещены на стеке, большинство решений заключается в использовании:

captureStillImageAsynchronouslyFromConnection 

Я уверен, если это просто Swift 3,0, но Xcode не распознает эту функцию.

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

Here - ссылка на мой полный код для лучшего понимания моей программы.

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

+0

[Оби-Ван Кеноби голос:] Uuuuuse Документов, Luuuuuke! В Swift 3 это ['captureStillImageAsynchronously (from: completeHandler:)'] (https://developer.apple.com/reference/avfoundation/avcapturestillimageoutput/1387374-capturestillimageasynchronously). – matt

+0

Вы можете сослаться на это http://stackoverflow.com/questions/28756363/how-to-capture-picture-with-avcapturesession-in-swift –

ответ

1

если вы ориентируетесь на iOS 10 или выше. captureStillImageAsynchronously(from:completionHandler:) устарел вместе с AVCaptureStillImageOutput.

Согласно документации

Класс AVCaptureStillImageOutput осуждается в прошивкой 10.0 и не не поддерживает новые функции захвата камеры, такие как RAW вывода изображения, Живых фотографий или широкой цветовой гаммы цвета. В iOS 10.0 и более поздних версиях вместо этого используйте класс AVCapturePhotoOutput. (The AVCaptureStillImageOutput класс остается поддерживается в MacOS 10.12.)

Согласно кода вы уже используете AVCapturePhotoOutput. Поэтому просто выполните следующие шаги, чтобы сделать снимок с сеанса. То же можно найти здесь: Apple documentation.

  1. Создайте объект AVCapturePhotoOutput. Используйте его свойства для определения поддерживаемых настроек захвата и для включения определенных функций (например, для захвата живых фотографий).
  2. Создайте и настройте объект AVCapturePhotoSettings для выбора функций и настроек для конкретного захвата (например, включить ли стабилизацию изображения или вспышку).
  3. Захват изображения путем передачи объекта настроек фотографии в метод capturePhoto (с помощью: delegate :) вместе с объектом-делегатом, реализующим протокол AVCapturePhotoCaptureDelegate. Затем вывод фотоизображения вызывает ваш делегат, чтобы уведомить вас о значительных событиях во время процесса захвата.

вы уже делаете шаг 1 и 2. Таким образом, добавьте эту строку в код

@IBAction func takePhoto(_sender: Any) { 
     print("Taking Photo") 
     sessionOutput.capturePhoto(with: sessionOutputSetting, delegate: self as! AVCapturePhotoCaptureDelegate) 

    } 

и реализовать функцию AVCapturePhotoCaptureDelegate

optional public func capture(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?, previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?) 

Обратите внимание, что этот делегат даст много контроля над фотографиями. Ознакомьтесь с документацией для получения дополнительных функций. Также вам нужно обработать данные изображения, что означает, что вам нужно преобразовать буфер выборки в UIImage.

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... 
} 

Обратите внимание, что изображение, которое вы получите повернут влево, так что мы должны вручную поворачивать вправо так, получить предварительный просмотр, как изображение.

Более подробную информацию можно найти в моей предыдущей SO answer

+0

Вау, спасибо за это. Brilliant. –

+0

@ F.Bar, я прошел через вашу дорогу. Не упоминайте об этом. – Bluewings

Смежные вопросы