web-dev-qa-db-fra.com

Comment enregistrer une vidéo avec avfoundation dans Swift?

J'essaie de comprendre comment enregistrer une vidéo en utilisant AVFoundation dans Swift. J'ai réussi à créer un appareil photo personnalisé, mais j'ai seulement compris comment prendre des photos avec et je n'arrive pas à comprendre comment enregistrer une vidéo. D'après ce que je comprends, vous devez utiliser AVCaptureVideoDataOutput pour obtenir les données de l'enregistrement, mais je ne sais pas comment démarrer l'enregistrement et implémenter les méthodes déléguées.

L'ensemble du guide de programmation AVFoundation/Capture de photos et de supports vidéo est en Objective-C et je n'arrive pas à le déchiffrer. Voici ma tentative d'accomplir cette tâche:

J'ai d'abord configuré la caméra/la session de capture

override func viewDidLoad() {
    super.viewDidLoad()

    captureSession.sessionPreset = AVCaptureSessionPresetHigh
    let devices = AVCaptureDevice.devices()
    for device in devices {
        if (device.hasMediaType(AVMediaTypeVideo)) {
            if(device.position == AVCaptureDevicePosition.Back) {
                captureDevice = device as? AVCaptureDevice
                if captureDevice != nil {
                    beginSession()
                }
            }
        }
    }

}

Ensuite, une fois que beginSession () est appelée, j'ai configuré le flux en direct

func beginSession() {
    var err : NSError? = nil
    captureSession.addInput(AVCaptureDeviceInput(device: captureDevice, error: &err))
    if err != nil {
        println("error: \(err?.localizedDescription)")
    }
    previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
    self.cameraView.layer.addSublayer(previewLayer)
    self.cameraView.bringSubviewToFront(takePhotoButton)
    self.cameraView.bringSubviewToFront(self.snappedPicture)
    self.cameraView.bringSubviewToFront(self.backButton)
    previewLayer?.frame = self.cameraView.layer.frame
    captureSession.startRunning()
}

Voici où je suis coincé là où l'utilisateur appuie sur enregistrement pour enregistrer et capturer une vidéo:

@IBAction func takeVideoAction(sender: AnyObject) {

    var recordingDelegate:AVCaptureFileOutputRecordingDelegate? = self

    var videoFileOutput = AVCaptureMovieFileOutput()
    self.captureSession.addOutput(videoFileOutput)

    let filePath = NSURL(fileURLWithPath: "filePath")

    videoFileOutput.startRecordingToOutputFileURL(filePath, recordingDelegate: recordingDelegate)

}

Ensuite, j'appelle self.videoFileOutput.stopRecording().

Enfin les méthodes déléguées

func captureOutput(captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!, fromConnections connections: [AnyObject]!, error: NSError!) {
    return
}

func captureOutput(captureOutput: AVCaptureFileOutput!, didStartRecordingToOutputFileAtURL fileURL: NSURL!, fromConnections connections: [AnyObject]!) {
    return
}

Et rien ne se passe comme vous pouvez l'imaginer car je ne sais pas comment l'implémenter correctement.

21
Garret Kaye

J'ai essayé votre code. Lorsque vous définissez un filePath significatif, tout se passe bien. Modifiez votre filePath comme ceci et vous obtiendrez les méthodes déléguées invoquées:

    let documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
    let filePath = documentsURL.URLByAppendingPathComponent("temp")

    // Do recording and save the output to the `filePath`
    videoFileOutput.startRecordingToOutputFileURL(filePath, recordingDelegate: recordingDelegate)
15
liuyaodong