Save Video Using AVFoundation Swift

后端 未结 6 1547
感情败类
感情败类 2021-02-05 08:57

Hi I followed a course by Jared Davidson to create a custom camera view and save pictures using AVFoundation. https://www.youtube.com/watch?v=w0O3ZGUS3pk

However I would

6条回答
  •  南笙
    南笙 (楼主)
    2021-02-05 09:30

    Thank you for this. It was very helpful to me. Here is a version of Rhythmic Fistman's answer ported to Swift 3 with the required import statements and delegate methods.

    import UIKit
    import AVFoundation
    
    class ViewController: UIViewController,
    AVCaptureFileOutputRecordingDelegate {
    
    var captureSession = AVCaptureSession()
    var sessionOutput = AVCaptureStillImageOutput()
    var movieOutput = AVCaptureMovieFileOutput()
    var previewLayer = AVCaptureVideoPreviewLayer()
    
    @IBOutlet var cameraView: UIView!
    
    override func viewWillAppear(_ animated: Bool) {
        self.cameraView = self.view
    
        let devices = AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo)
        for device in devices! {
            if (device as AnyObject).position == AVCaptureDevicePosition.front{
    
    
                do{
    
                    let input = try AVCaptureDeviceInput(device: device as! AVCaptureDevice)
    
                    if captureSession.canAddInput(input){
    
                        captureSession.addInput(input)
                        sessionOutput.outputSettings = [AVVideoCodecKey : AVVideoCodecJPEG]
    
                        if captureSession.canAddOutput(sessionOutput){
    
                            captureSession.addOutput(sessionOutput)
    
                            previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
                            previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
                            previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.portrait
                            cameraView.layer.addSublayer(previewLayer)
    
                            previewLayer.position = CGPoint(x: self.cameraView.frame.width / 2, y: self.cameraView.frame.height / 2)
                            previewLayer.bounds = cameraView.frame
    
    
                        }
    
                        captureSession.addOutput(movieOutput)
    
                        captureSession.startRunning()
    
                        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
                        let fileUrl = paths[0].appendingPathComponent("output.mov")
                        try? FileManager.default.removeItem(at: fileUrl)
                        movieOutput.startRecording(toOutputFileURL: fileUrl, recordingDelegate: self)
    
                        let delayTime = DispatchTime.now() + 5
                        DispatchQueue.main.asyncAfter(deadline: delayTime) {
                            print("stopping")
                            self.movieOutput.stopRecording()
                        }
                    }
    
                }
                catch{
    
                    print("Error")
                }
    
            }
        }
    
    }
    
    
    //MARK: AVCaptureFileOutputRecordingDelegate Methods
    
    func capture(_ captureOutput: AVCaptureFileOutput!, didStartRecordingToOutputFileAt fileURL: URL!, fromConnections connections: [Any]!) {
    
    }
    
    func capture(_ captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAt outputFileURL: URL!, fromConnections connections: [Any]!, error: Error!) {
        print("FINISHED \(error)")
        // save video to camera roll
        if error == nil {
            UISaveVideoAtPathToSavedPhotosAlbum(outputFileURL.path, nil, nil, nil)
        }
    }
    
    }
    

提交回复
热议问题