Получение CVPixelBuffer из методов AVCapturePhotoDelegate - PullRequest
0 голосов
/ 29 сентября 2018

Я хотел бы получить pixelBuffer из didFinishProcessingPhoto метода делегата, но это ноль.

func capturePhoto() {
        let format = [AVVideoCodecKey: AVVideoCodecType.jpeg]
        let settings = AVCapturePhotoSettings(format: format)
        output.capturePhoto(with: settings, delegate: self)
    }

и расширение:

extension CaptureSessionManager: AVCapturePhotoCaptureDelegate {
    func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
        guard let pixelBuffer = photo.pixelBuffer else {
            return
        }

        bufferSubject.onNext(pixelBuffer)
    }
}

До этого я, очевидно, добавляю вывод всессия.Должен ли я использовать какой-то другой метод из этого делегата?

1 Ответ

0 голосов
/ 29 сентября 2018

Я понял это сам после прочтения документации.

Сначала убедитесь, что AVCaptureSession.Preset.photo используется как sessionPreset: session.sessionPreset = .photo.

Затем важно использовать rawPixeFormatTypeпотому что установка его в jpeg или hevc не даст pixelBuffer.Это может быть достигнуто следующим образом:

guard let availableRawFormat = self.output.availableRawPhotoPixelFormatTypes.first else {
            return
        }

let photoSettings = AVCapturePhotoSettings(rawPixelFormatType: availableRawFormat,
                                                   processedFormat: [AVVideoCodecKey : AVVideoCodecType.hevc])

output.capturePhoto(with: photoSettings, delegate: self)

processedFormat: в AVCapturePhotoSettings init является необязательным.

...