iOS Swift 2录制视频AVCaptureSession

时间:2015-09-24 18:09:45

标签: ios swift video avcapturesession

我创建了一个AVCaptureSession并附加了前置摄像头

do {
   try captureSession.addInput(AVCaptureDeviceInput(device: captureDevice))
   }catch{print("err")}

现在我想开始并停止在touche事件上录制。我该怎么做?

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        print("touch")
        //Start Recording
    }

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
        print("release");
        //End Recording and Save
    }

1 个答案:

答案 0 :(得分:6)

您没有提及是否使用AVCaptureVideoDataOutputCMSampleBuffer作为会话的输出。前者非常适合快速录制视频而无需进一步编码,后者通过在录制会话期间获取AVCaptureMovieFileOutput的块来用于更高级的录制。

对于这个答案的范围,我将使用import UIKit import AVFoundation import AssetsLibrary class ViewController: UIViewController, AVCaptureFileOutputRecordingDelegate { var captureSession = AVCaptureSession() lazy var frontCameraDevice: AVCaptureDevice? = { let devices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo) as! [AVCaptureDevice] return devices.filter{$0.position == .Front}.first }() lazy var micDevice: AVCaptureDevice? = { return AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeAudio) }() var movieOutput = AVCaptureMovieFileOutput() private var tempFilePath: NSURL = { let tempPath = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent("tempMovie").URLByAppendingPathExtension("mp4").absoluteString if NSFileManager.defaultManager().fileExistsAtPath(tempPath) { do { try NSFileManager.defaultManager().removeItemAtPath(tempPath) } catch { } } return NSURL(string: tempPath)! }() private var library = ALAssetsLibrary() override func viewDidLoad() { super.viewDidLoad() //start session configuration captureSession.beginConfiguration() captureSession.sessionPreset = AVCaptureSessionPresetHigh // add device inputs (front camera and mic) captureSession.addInput(deviceInputFromDevice(frontCameraDevice)) captureSession.addInput(deviceInputFromDevice(micDevice)) // add output movieFileOutput movieOutput.movieFragmentInterval = kCMTimeInvalid captureSession.addOutput(movieOutput) // start session captureSession.commitConfiguration() captureSession.startRunning() } override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { print("touch") // start capture movieOutput.startRecordingToOutputFileURL(tempFilePath, recordingDelegate: self) } override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { print("release") //stop capture movieOutput.stopRecording() } private func deviceInputFromDevice(device: AVCaptureDevice?) -> AVCaptureDeviceInput? { guard let validDevice = device else { return nil } do { return try AVCaptureDeviceInput(device: validDevice) } catch let outError { print("Device setup error occured \(outError)") return nil } } func captureOutput(captureOutput: AVCaptureFileOutput!, didStartRecordingToOutputFileAtURL fileURL: NSURL!, fromConnections connections: [AnyObject]!) { } func captureOutput(captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!, fromConnections connections: [AnyObject]!, error: NSError!) { if (error != nil) { print("Unable to save video to the iPhone \(error.localizedDescription)") } else { // save video to photo album library.writeVideoAtPathToSavedPhotosAlbum(outputFileURL, completionBlock: { (assetURL: NSURL?, error: NSError?) -> Void in if (error != nil) { print("Unable to save video to the iPhone \(error!.localizedDescription)") } }) } } } ,这是一些极简主义的起始代码:

2016-02-03 Ticket1 4.25
2016-02-04 Ticket2 .25
2016-02-04 Ticket2 1.00
2016-02-05 Ticket3 .75

有关Camera Capture的更多信息,请参阅WWDC 2014 - Session 508