CMSampleBufferGetImageBuffer (sampleBuffer) вернуть ноль - PullRequest
0 голосов
/ 03 июля 2018

Я использую этот код для захвата видео с камеры, но CMSampleBufferGetImageBuffer (sampleBuffer) всегда возвращает ноль. В чем проблема?. Вот код, я изменяю код из этого источника для адаптации к Swift 4 https://github.com/FlexMonkey/CoreImageHelpers/blob/master/CoreImageHelpers/coreImageHelpers/CameraCaptureHelper.swift

import AVFoundation
import CoreMedia
import CoreImage
import UIKit


class CameraCaptureHelper: NSObject
{
let captureSession = AVCaptureSession()
let cameraPosition: AVCaptureDevice.Position

weak var delegate: CameraCaptureHelperDelegate?

required init(cameraPosition: AVCaptureDevice.Position)
{
    self.cameraPosition = cameraPosition

    super.init()

    initialiseCaptureSession()
}

fileprivate func initialiseCaptureSession()
{
    captureSession.sessionPreset = AVCaptureSession.Preset.photo

    guard let camera = AVCaptureDevice.default(.builtInWideAngleCamera,
                                               for: .video, position: cameraPosition)
        else {
            fatalError("Unable to access camera")
    }
    do
    {
        let input = try AVCaptureDeviceInput(device: camera)

        captureSession.addInput(input)
    }
    catch
    {
        fatalError("Unable to access back camera")
    }

    let videoOutput = AVCaptureVideoDataOutput()

    videoOutput.setSampleBufferDelegate(self,
                                        queue: DispatchQueue(label: "sample buffer delegate", attributes: []))

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

    captureSession.startRunning()
}
}

extension CameraCaptureHelper: AVCaptureVideoDataOutputSampleBufferDelegate
{

func captureOutput(_ output: AVCaptureOutput, didDrop sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {

    connection.videoOrientation = .landscapeRight //AVCaptureVideoOrientation(rawValue: UIApplication.shared.statusBarOrientation.rawValue)!

    guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else
    {
        return
    }

    DispatchQueue.main.async
        {
            self.delegate?.newCameraImage(self,
                                          image: CIImage(cvPixelBuffer: pixelBuffer))
    }
}

}

protocol CameraCaptureHelperDelegate: class
{
func newCameraImage(_ cameraCaptureHelper: CameraCaptureHelper, image: CIImage)
}

1 Ответ

0 голосов
/ 03 июля 2018

Вы пытаетесь получить доступ к пиксельному буферу из обратного вызова "только что отброшенный буфер". Заголовочный файл говорит:

Объект CMSampleBuffer, передаваемый этому методу делегата, будет содержать метаданные об отброшенном видеокадре, например его продолжительность и метку времени представления, но не будет содержать реальных видеоданных.

Это следует делать с помощью обратного вызова делегата didOutputSampleBuffer:.

...