我可以使用下面的代码捕获视频。在我的任务中,我需要连续捕获视频,但我需要每5秒保存一次outputFileURL。前5秒它工作正常,但没有连续循环。有谁能指导我完成这项任务吗?

func VideoCaptureMethod() {
    //self.cameraView = self.view

  //  self.cameraManager.resumeCaptureSession()


    let devices = AVCaptureDevice.devices(for: AVMediaType.video)


    for device in devices {
        if (device as AnyObject).position == AVCaptureDevice.Position.back{


            do{

                let input = try AVCaptureDeviceInput(device: device )

                if captureSession.canAddInput(input){

                    captureSession.addInput(input)
                    sessionOutput.outputSettings = [AVVideoCodecKey : AVVideoCodecJPEG]

                    if captureSession.canAddOutput(sessionOutput){

                        captureSession.addOutput(sessionOutput)

                        previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
                        previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
                        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(to: fileUrl, recordingDelegate: self)




                    let delayTime = DispatchTime.now() + 5
                    DispatchQueue.main.asyncAfter(deadline: delayTime) {
                        print("stopping")
                        self.movieOutput.stopRecording()

                    }


                }

            }
            catch{

                print("Error")
            }

        }
    }

}



func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {

        print(outputFileURL)

        self.VideoCaptureMethod()

    }

最佳答案

下面是代码示例:

import UIKit
import AVFoundation

class ViewController: UIViewController, AVCaptureFileOutputRecordingDelegate
{
    var captureSession = AVCaptureSession()
    var sessionOutput = AVCaptureStillImageOutput()
    var movieOutput = AVCaptureMovieFileOutput()
    var previewLayer = AVCaptureVideoPreviewLayer()
    var timer = Timer()

    @IBOutlet var cameraView: UIView!

    override func viewWillAppear(_ animated: Bool) {
        self.cameraView = self.view

        let session = AVCaptureDevice.DiscoverySession.init(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaType.video, position: .back)
        let devices = session.devices
        guard let audioDevice = AVCaptureDevice.default(for: .audio) else { return }
        for device in devices
        {
            if device.position == AVCaptureDevice.Position.back
            {
                do{
                    let input = try AVCaptureDeviceInput(device: device )
                    let audioDeviceInput = try AVCaptureDeviceInput(device: audioDevice)
                    if captureSession.canAddInput(input){

                        captureSession.addInput(input)
                        captureSession.addInput(audioDeviceInput)
                        sessionOutput.outputSettings = [AVVideoCodecKey : AVVideoCodecType.jpeg]

                        if captureSession.canAddOutput(sessionOutput)
                        {
                            captureSession.addOutput(sessionOutput)

                            previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
                            previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
                            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()
                        self.handleCaptureSession()

                    }

                }
                catch{

                    print("Error")
                }

            }
        }

    }

    func handleCaptureSession()
    {
        print("-----------Starting-----------")
        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        let dateFormatter : DateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MMM-dd HH:mm:ss"
        let date = Date()
        let dateString = dateFormatter.string(from: date)
        let fileName = dateString + "output.mov"
        let fileUrl = paths[0].appendingPathComponent(fileName)
        try? FileManager.default.removeItem(at: fileUrl)
        self.movieOutput.startRecording(to: fileUrl, recordingDelegate: self)
        DispatchQueue.main.asyncAfter(deadline: .now() + 5.0, execute:
            {
                print("-----------Stopping-----------")
                self.movieOutput.stopRecording()
        })
    }


    func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {
        print("FINISHED \(error )")
        // save video to camera roll
        if error == nil {
            print("---------------FilePath--------------\(outputFileURL.path)")
            UISaveVideoAtPathToSavedPhotosAlbum(outputFileURL.path, nil, nil, nil)

            self.handleCaptureSession()
        }
    }
}

10-08 12:15