2015-05-07 117 views
4

我试图从摄像头捕获视频帧并在UIImageView上实时显示洪水图像。 我试图改编AVCaptureVideoDataOutputSampleBufferDelegate作为我的viewcontroller。 我也执行captureOutput,但captureOutput永远不会被调用。在Swift中,改编的AVCaptureVideoDataOutputSampleBufferDelegate,但captureOutput永远不会被调用

这里是我的代码:

import UIKit 
import AVFoundation 

class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate { 

    @IBOutlet weak var imageView: UIImageView! 
    @IBOutlet var cameraView: UIView! 

    var selectedImage :UIImage! 

    let captureSession = AVCaptureSession() 
    var captureDevice : AVCaptureDevice? 
    var videoCaptureOutput : AVCaptureVideoDataOutput! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     captureSession.sessionPreset = AVCaptureSessionPresetLow 
     self.captureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) 
     if(captureDevice != nil){ 
      beginSession() 
     } 
    } 


    func beginSession() { 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), { 
      self.videoCaptureOutput = AVCaptureVideoDataOutput() 
      self.videoCaptureOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey:kCVPixelFormatType_32BGRA] 
      self.videoCaptureOutput.alwaysDiscardsLateVideoFrames = true 

      self.captureSession.addOutput(self.videoCaptureOutput) 

      var err : NSError? = nil 
      self.captureSession.addInput(AVCaptureDeviceInput(device: self.captureDevice, error: &err)) 
      self.captureSession.sessionPreset = AVCaptureSessionPresetPhoto 
      if err != nil { 
       println("error: \(err?.localizedDescription)") 
      } 
      var previewLayer = AVCaptureVideoPreviewLayer(session: self.captureSession) 
      previewLayer?.frame = self.cameraView.layer.bounds 
      previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill 
      dispatch_async(dispatch_get_main_queue(), { // 2 
       // 3 
       self.cameraView.layer.addSublayer(previewLayer) 
       self.captureSession.startRunning() 

      }); 
     }); 
    } 

    func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) { 

     println("capture delegation called") 

     var imageProcessor = ImageProcessor() 
     imageView.image = imageProcessor.imageFromSampleBuffer(sampleBuffer) 
    } 
} 

正如你所看到的,我试图处理上imageview图像和实时显示拍摄框架,假设我ImageProcessor()作品完美....

任何帮助将不胜感激,谢谢。

回答

5

您的委托方法未被调用,因为您根本没有将委托设置为videoCaptureOutput。为此,您必须调用videoCaptureOutput setSampleBufferDelegate(self ,queue : queue)方法,其中队列参数是应在其上调用回调的队列。

相关问题