使用AVCaptureSession获取相机输出,并成功添加了音频和视频输入和输出.
{ 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录制视频
解决方法
你需要一个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