使用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