web-dev-qa-db-fra.com

Swift: sauvegarde de la vidéo de NSURL sur un rouleau de caméra utilisateur

J'ai une variable videoURL de type NSURL.

Si j'appelle println(videoURL), le résultat obtenu est le suivant: http://files.parsetfss.com/d540f71f-video.mp4

J'ai un bouton configuré qui prend cette videoURL et enregistre la vidéo sur la pellicule de la caméra de l'utilisateur.

Le meilleur que j'ai fait est le suivant: 

UISaveVideoAtPathToSavedPhotosAlbum(videoPath: String!, completionTarget: AnyObject!, completionSelector: Selector, contextInfo: UnsafeMutablePointer<Void>)

Bien que je ne sois même pas sûr que cela fonctionne ou non, je ne vois pas comment convertir videoFile:NSURL en videoPath.

Toute aide est appréciée à ce sujet.

Modifier:

Ce qui suit est un échec:

UISaveVideoAtPathToSavedPhotosAlbum(videoURL.relativePath, self, nil, nil)
19
George Poulos

AssetsLibrary est obsolète

1: importer des photos

import Photos

2: Utilisez ce code pour enregistrer la vidéo de l’URL à la bibliothèque de caméras. 

PHPhotoLibrary.sharedPhotoLibrary().performChanges({
             PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL(nsUrlToYourVideo)
         }) { saved, error in
             if saved {
                 let alertController = UIAlertController(title: "Your video was successfully saved", message: nil, preferredStyle: .Alert) 
                 let defaultAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
                 alertController.addAction(defaultAction)
                 self.presentViewController(alertController, animated: true, completion: nil)
             }
         }

Swift 3 & Swift 4

PHPhotoLibrary.shared().performChanges({
    PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: urlToYourVideo)
}) { saved, error in
    if saved {
        let alertController = UIAlertController(title: "Your video was successfully saved", message: nil, preferredStyle: .alert)
        let defaultAction = UIAlertAction(title: "OK", style: .default, handler: nil)
        alertController.addAction(defaultAction)
        self.present(alertController, animated: true, completion: nil)
    }
}
42
Boris

La réponse acceptée ne fonctionne plus avec Swift 3.0 et iOS 10.

Tout d’abord, vous devez définir l’autorisation suivante dans le fichier Plist de votre application:

Confidentialité - Description de l'utilisation de la photothèque

Fournissez une chaîne qui est présentée à l'utilisateur pour expliquer pourquoi vous demandez l'autorisation.

Ensuite, importez des photos:

import Photos

Enfin, voici le code mis à jour pour Swift 3.0 :

PHPhotoLibrary.shared().performChanges({
    PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: fileURL)
}) { saved, error in
    if saved {
        let alertController = UIAlertController(title: "Your video was successfully saved", message: nil, preferredStyle: .alert)
        let defaultAction = UIAlertAction(title: "OK", style: .default, handler: nil)
        alertController.addAction(defaultAction)
        self.present(alertController, animated: true, completion: nil)
    }
}
7
CodeBender

Pour enregistrer une vidéo de NSURL sur une pellicule utilisateur

func video(videoPath: NSString, didFinishSavingWithError error: NSError?, contextInfo info: AnyObject) 
 {
    if let _ = error {
       print("Error,Video failed to save")
    }else{
       print("Successfully,Video was saved")
    }
}







func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

    if let conversationField = self.conversation {

      if (mediaType?.isEqual((kUTTypeMovie as NSString) as String))!
        {
            let theVideoURL: URL? = (info[UIImagePickerControllerMediaURL] as? URL)

            if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum((theVideoURL?.path)!))
            {
                UISaveVideoAtPathToSavedPhotosAlbum((theVideoURL?.path)!, self, #selector(ConversationDetailsViewController.video(videoPath:didFinishSavingWithError:contextInfo:)), nil)
            }   
   }
   self.dismiss(animated: true, completion: nil)
}

Référence de :: https://www.raywenderlich.com/94404/play-record-merge-videos-ios-Swift

5
Disha

obsolète à partir de iOS 9

1: import AssetsLibrary

import AssetsLibrary

2: Utilisez ce code pour enregistrer la vidéo de l’URL à la bibliothèque de caméras.

ALAssetsLibrary().writeVideoAtPathToSavedPhotosAlbum(outputFileURL, completionBlock: nil)
3
Saqib Omer

Il suffit de l'utiliser et de coller l'URL de votre vidéo:

PHPhotoLibrary.sharedPhotoLibrary().performChanges({ () -> Void in

    let createAssetRequest: PHAssetChangeRequest = PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL(NSURL(string: /* your url */)!)!
    createAssetRequest.placeholderForCreatedAsset

    }) { (success, error) -> Void in
        if success {

            //popup alert success
        }
        else {
           //popup alert unsuccess
        }
}
0
Hacker Mane