2016-08-16 9 views
10

Использует AVCaptureSession, чтобы получить выход камеры и успешно добавил аудио и видео входы и выходы.Как записывать видео с использованием AVCaptureVideoDataOutput

{ 

    var captureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) as AVCaptureDevice 

    var error: NSError? = nil 

    do { 

     //remove the previous inputs 
     let inputs = cameraSession.inputs as! [AVCaptureDeviceInput] 
     for oldInput:AVCaptureDeviceInput in inputs { 
      cameraSession.removeInput(oldInput) 
     } 
     cameraSession.beginConfiguration() 

     if cameraPosition.isEqualToString("Front") { 
      captureDevice = cameraWithPosition(.Front)! 
     } 
     else { 
      captureDevice = cameraWithPosition(.Back)! 
     } 

     let deviceInput = try AVCaptureDeviceInput(device: captureDevice) 

     if (cameraSession.canAddInput(deviceInput) == true) { 
      cameraSession.addInput(deviceInput) 
     } 

     let dataOutput = AVCaptureVideoDataOutput() 
     dataOutput.videoSettings = [(kCVPixelBufferPixelFormatTypeKey as NSString) : NSNumber(unsignedInt: kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)] 
     dataOutput.alwaysDiscardsLateVideoFrames = true 

     if (cameraSession.canAddOutput(dataOutput) == true) { 
      cameraSession.addOutput(dataOutput) 
     } 

     let audioCheck = AVCaptureDevice.devicesWithMediaType(AVMediaTypeAudio) 
     if audioCheck.isEmpty { 
      print("no audio device") 
      return 
     } 

     let audioDevice: AVCaptureDevice! = audioCheck.first as! AVCaptureDevice 

     var audioDeviceInput: AVCaptureDeviceInput? 

     do { 
      audioDeviceInput = try AVCaptureDeviceInput(device: audioDevice) 
     } catch let error2 as NSError { 
      error = error2 
      audioDeviceInput = nil 
     } catch { 
      fatalError() 
     } 

     if error != nil{ 
      print(error) 
      let alert = UIAlertController(title: "Error", message: error!.localizedDescription 
       , preferredStyle: .Alert) 
      alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) 
      self.presentViewController(alert, animated: true, completion: nil) 
     } 
     if cameraSession.canAddInput(audioDeviceInput){ 
      cameraSession.addInput(audioDeviceInput) 
     } 

     cameraSession.commitConfiguration() 

     let queue = dispatch_queue_create("com.invasivecode.videoQueue", DISPATCH_QUEUE_SERIAL) 
     dataOutput.setSampleBufferDelegate(self, queue: queue) 

    } 
    catch let error as NSError { 
     NSLog("\(error), \(error.localizedDescription)") 
    } 
} 

Использование AVCaptureMovieFileOutput могут сохранить вывод видео в библиотеке фотографий с помощью

movieFileOutput.startRecordingToOutputFileURL(outputFilePath, recordingDelegate: self) 

но я использую AVCaptureVideoDataOutput в качестве вывода для выполнения дополнительных работ по мета-данных, я получаю от делегатов и попытаться записать видео, но я не могу получить какие-либо методы для запуска и остановки записи видео.

Предложите, как записать видео с помощью AVCaptureVideoDataOutput

+0

См. Этот раздел на [github] (https://gist.github.com/hayago/93108 55). –

ответ

2

Вам нужно AVCaptureSession сделать это:

//First add AVCaptureVideoDataOutput to AVCaptureSession 
AVCaptureSession *_captureSession; 
_captureSession = [[AVCaptureSession alloc] init]; 
......Configuration...... 

AVCaptureVideoDataOutput *videoOut = [[AVCaptureVideoDataOutput alloc] init]; 
......Configuration...... 
if ([_captureSession canAddOutput:videoOut]) { 
    [_captureSession addOutput:videoOut]; 
} 

//Then use captureSession to start and stop recording 
[_captureSession startRunning]; 
[_captureSession stopRunning]; 

Пожалуйста, смотрите через RosyWriterCapturePipeline.m, это очень хороший пример:

RosyWriter

+1

Я ищу код в swift не в Objective C – Rajjjjjj

+0

Дело в том, что люди не могут найти, как это сделать, как определить место записи и как использовать «videoOut» для записи, который не включен в ответ. Кстати, я один из людей. – Hope

 Смежные вопросы

  • Нет связанных вопросов^_^