2015-04-28 9 views
6

मैंने वीडियो आउटपुट कैप्चर करने और इसे UIView के माध्यम से उपयोगकर्ता को प्रदर्शित करने के लिए एक AVCaptureSession बनाया है। अब मैं एक बटन (टेकफोटो विधि) पर क्लिक करने और UIImageView में सत्र से छवि को प्रदर्शित करने में सक्षम होना चाहता हूं। मैंने प्रत्येक डिवाइस कनेक्शन के माध्यम से पुनरावृत्ति करने की कोशिश की है और आउटपुट को सहेजने का प्रयास किया है, लेकिन यह काम नहीं किया है। कोड मैंएवी कैप्चर सत्र छवि को कैप्चर करने के लिए स्वीकृति

नीचे
let captureSession = AVCaptureSession() 
var stillImageOutput: AVCaptureStillImageOutput! 

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


// If we find a device we'll store it here for later use 
var captureDevice : AVCaptureDevice? 

override func viewDidLoad() { 
    // Do any additional setup after loading the view, typically from a nib. 
    super.viewDidLoad() 
    println("I AM AT THE CAMERA") 
    captureSession.sessionPreset = AVCaptureSessionPresetLow 
    self.captureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) 
    if(captureDevice != nil){ 
     beginSession() 
    } 
} 
    func beginSession() { 

    self.stillImageOutput = AVCaptureStillImageOutput() 
    self.captureSession.addOutput(self.stillImageOutput) 
    var err : NSError? = nil 
    self.captureSession.addInput(AVCaptureDeviceInput(device: self.captureDevice, error: &err)) 

    if err != nil { 
     println("error: \(err?.localizedDescription)") 
    } 

    var previewLayer = AVCaptureVideoPreviewLayer(session: self.captureSession) 
    self.cameraView.layer.addSublayer(previewLayer) 
    previewLayer?.frame = self.cameraView.layer.frame 
    captureSession.startRunning() 
} 

@IBAction func takePhoto(sender: UIButton) { 
    self.stillImageOutput.captureStillImageAsynchronouslyFromConnection(self.stillImageOutput.connectionWithMediaType(AVMediaTypeVideo)) { (buffer:CMSampleBuffer!, error:NSError!) -> Void in 
     var image = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(buffer) 
     var data_image = UIImage(data: image) 
     self.imageView.image = data_image 
    } 
} 
} 
+0

अब इस त्रुटि हो रही है के रूप में सत्र बनाने विधि में एक प्रेषण का उपयोग करके देखें 'न आया हुआ अपवाद 'NSInvalidArgumentException', कारण की वजह से एप्लिकेशन समाप्त: '*** आउटपुट सत्र कब्जा करने के लिए -> -> अधिक है क्योंकि एक ही प्रकार के एक आउटपुट से अधिक है असमर्थित। ' –

+0

लाइन को ले कर शुरू करें: captureSession.addOutput (self.stillImageOutput) और देखें कि आप कहां जोड़ रहे हैं। यह त्रुटि को ठीक करना चाहिए। – user3353890

+0

@ user3353890 मैंने त्रुटि तय की है (मैंने उपरोक्त कोड अपडेट किया है) लेकिन अब मुझे केवल कैमरे से वीडियो के बजाय मेरे पूर्वावलोकन के लिए एक स्थिर छवि मिल रही है ...? –

उत्तर

4

आप जब यह शुरू करने से पहले सत्र के लिए इनपुट और आउटपुट को जोड़ने के लिए एक नया धागा जोड़ने का प्रयास करना चाहिए। एप्पल के प्रलेखन में वे राज्य

महत्वपूर्ण: startRunning विधि एक अवरुद्ध कॉल जो कुछ समय लग सकता है, इसलिए आप इतना है कि मुख्य कतार अवरुद्ध नहीं कर रहा है एक सीरियल कतार पर सत्र सेटअप प्रदर्शन करना चाहिए (जो यूआई रहता है उत्तरदायी)। कैननिकल कार्यान्वयन उदाहरण के लिए आईओएस के लिए AVCam देखें।

इस तरह के नीचे

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), { // 1 
     self.captureSession.addOutput(self.stillImageOutput) 
     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() 
      }); 
     }); 
+0

धन्यवाद यह काम खत्म हो गया! –

संबंधित मुद्दे