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.
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)