user6005637
user6005637

Reputation:

How to capture video in iOS (CUSTOM)?

I am using this to capture image

    var captureDevice : AVCaptureDevice?
var picker = UIImagePickerController()
var captureSession = AVCaptureSession()
var stillImageOutput = AVCaptureStillImageOutput()
var captureVideoPreviewLayer = AVCaptureVideoPreviewLayer()

 func captureImage (sender:AnyObject?) {

    isCapturingImage = true
    var videoConnection :AVCaptureConnection? = nil
    for  connection:AVCaptureConnection in stillImageOutput.connections as! [AVCaptureConnection] {

        for port:AVCaptureInputPort in connection.inputPorts as! [AVCaptureInputPort]{

            if(port.mediaType == AVMediaTypeVideo){

                videoConnection = connection
                break;

            }


        }

        if((videoConnection) != nil) {break}

    }

    stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler: {
        (imageSampleBuffer:CMSampleBufferRef! , error :NSError!) in

        if (imageSampleBuffer  != nil) {


            var imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageSampleBuffer)
            let capturedImage = UIImage.init(data: imageData, scale:1)

        }
    })


}

How can i implement capture video ? I hardly can find any tutorial about custom video capture. Anyone can implement the function to capture video ?

Upvotes: 0

Views: 314

Answers (1)

Surya Subenthiran
Surya Subenthiran

Reputation: 2217

Use the following code to record video using AVFoundation

class ViewController: UIViewController,AVCaptureFileOutputRecordingDelegate {

    @IBOutlet weak var cameraView: UIView!

    var captureSession : AVCaptureSession!
    var movieFileOutput : AVCaptureMovieFileOutput!

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        beginSession()

    }

    func beginSession() {
        captureSession = AVCaptureSession()

        do {

            captureSession.beginConfiguration()

            let cameraDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) as AVCaptureDevice
            let cameraDeviceInput = try AVCaptureDeviceInput(device: cameraDevice)
            if (captureSession.canAddInput(cameraDeviceInput) == true) {
                captureSession.addInput(cameraDeviceInput)
            }

            let audioDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeAudio) as AVCaptureDevice
            let audioDeviceInput = try AVCaptureDeviceInput(device: audioDevice)
            if (captureSession.canAddInput(audioDeviceInput) == true) {
                captureSession.addInput(audioDeviceInput)
            }

            movieFileOutput = AVCaptureMovieFileOutput()
            if (captureSession.canAddOutput(movieFileOutput) == true) {
                captureSession.addOutput(movieFileOutput)
            }

            captureSession.commitConfiguration()
            captureSession.startRunning()

            let previewLayer =  AVCaptureVideoPreviewLayer(session: captureSession)
            previewLayer.bounds = CGRect(x: 0, y: 0, width: self.view.bounds.width, height: self.view.bounds.height)
            previewLayer.position = CGPoint(x: CGRectGetMidX(self.view.bounds), y: CGRectGetMidY(self.view.bounds))
            previewLayer.videoGravity = AVLayerVideoGravityResize
            cameraView.layer.addSublayer(previewLayer)

        }

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

    }

    func startRecording() {
        let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
        let documentsDirectory = paths[0] as NSString
        let outputFile = documentsDirectory.stringByAppendingPathComponent("output.mov")
        let outputURL = NSURL(fileURLWithPath:outputFile)

        movieFileOutput.startRecordingToOutputFileURL(outputURL, recordingDelegate: self)

    }

    func stopRecording() {
        movieFileOutput.stopRecording()
        captureSession.stopRunning()
    }

    func captureOutput(captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!, fromConnections connections: [AnyObject]!, error: NSError!) {
        print("Video URL =\(outputFileURL)")
    }

}

After stopping the video the AVFoundation calls didFinishRecordingToOutputFileAtURL delegate with parameter outputFileURL which is a path recorded video.

Hope this helps.

Upvotes: 2

Related Questions