Swift iOS AVVideoCapturePreviewLayer resolves to nil



在我的代码的viewDidLoad()部分,我有这个

    let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
    previewView.layer.addSublayer(previewLayer)

但是当它在这里被调用时,它在编译器中解析为nil:

func captureOutput(captureOutput: AVCaptureOutput!,didOutputSampleBuffer sampleBuffer: CMSampleBuffer!,fromConnection connection: AVCaptureConnection!) {
    autoreleasepool {
        let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!
        let formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer)!
        self.currentVideoDimensions = CMVideoFormatDescriptionGetDimensions(formatDescription)
        self.currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(sampleBuffer)

        // CVPixelBufferLockBaseAddress(imageBuffer, 0)
        // let width = CVPixelBufferGetWidthOfPlane(imageBuffer, 0)
        // let height = CVPixelBufferGetHeightOfPlane(imageBuffer, 0)
        // let bytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer, 0)
        // let lumaBuffer = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0)
        //
        // let grayColorSpace = CGColorSpaceCreateDeviceGray()
        // let context = CGBitmapContextCreate(lumaBuffer, width, height, 8, bytesPerRow, grayColorSpace, CGBitmapInfo.allZeros)
        // let cgImage = CGBitmapContextCreateImage(context)
        var outputImage = CIImage(CVPixelBuffer: imageBuffer)
        if self.filter != nil {
            self.filter.setValue(outputImage, forKey: kCIInputImageKey)
            outputImage = self.filter.outputImage!
        }
        let orientation = UIDevice.currentDevice().orientation
        var t: CGAffineTransform!
        if orientation == UIDeviceOrientation.Portrait {
            t = CGAffineTransformMakeRotation(CGFloat(-M_PI / 2.0))
        } else if orientation == UIDeviceOrientation.PortraitUpsideDown {
            t = CGAffineTransformMakeRotation(CGFloat(M_PI / 2.0))
        } else if (orientation == UIDeviceOrientation.LandscapeRight) {
            t = CGAffineTransformMakeRotation(CGFloat(M_PI))
        } else {
            t = CGAffineTransformMakeRotation(0)
        }
        outputImage = outputImage.imageByApplyingTransform(t)
        let cgImage = self.context.createCGImage(outputImage, fromRect: outputImage.extent)
        self.ciImage = outputImage
        dispatch_sync(dispatch_get_main_queue(), {

            self.previewLayer.contents = cgImage

        })
    }
}

有人知道为什么吗?我怀疑previewLayer是在captureSession实例化之前创建的,但是我放置了captureSession。在我的viewDidAppear()函数中启动代码,它仍然导致nil值。我现在把它放在viewDidLoad部分。如果有人能帮忙的话,我将不胜感激。

您没有分配给previewLayer属性。

let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
previewView.layer.addSublayer(previewLayer)

应该是

previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
previewView.layer.addSublayer(previewLayer)

最新更新