2016-02-18 2 views
10

Je suis actuellement en train d'afficher une vidéo dans mon application et je veux que l'utilisateur puisse l'enregistrer dans sa galerie d'appareils/album photo/appareil photo. Ici, il est ce que je fais, mais la vidéo est pas enregistré dans l'album:/Swift - Télécharger une vidéo depuis une URL distante et l'enregistrer dans un album photo

func downloadVideo(videoImageUrl:String) 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
     //All stuff here 

     print("downloadVideo"); 
     let url=NSURL(string: videoImageUrl); 
     let urlData=NSData(contentsOfURL: url!); 

     if((urlData) != nil) 
     { 
      let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]; 

      let fileName = videoImageUrl; //.stringByDeletingPathExtension 

      let filePath="\(documentsPath)/\(fileName)"; 

      //saving is done on main thread 

      dispatch_async(dispatch_get_main_queue(), {() -> Void in 

       urlData?.writeToFile(filePath, atomically: true); 
       print("videoSaved"); 
      }) 

     } 
    }) 

} 

I'va aussi regarder dans ceci:

let url:NSURL = NSURL(string: fileURL)!; 

    PHPhotoLibrary.sharedPhotoLibrary().performChanges({ 
     let assetChangeRequest = PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL(url); 
     let assetPlaceHolder = assetChangeRequest!.placeholderForCreatedAsset; 
     let albumChangeRequest = PHAssetCollectionChangeRequest(forAssetCollection: self.assetCollection) 
     albumChangeRequest!.addAssets([assetPlaceHolder!]) 
     }, completionHandler: saveVideoCallBack) 

Mais je l'erreur « Impossible de créer données du fichier (null) ". Mon "assetChangeRequest" est nul. Je ne comprends pas car mon URL est valide et quand j'y vais avec un navigateur, il télécharge un fichier rapide.

Si quelqu'un peut m'aider, ce serait apprécié! J'utilise Swift et cible iOS 8.0 min.

+1

Si vous souhaitez enregistrer un fichier à rouleau appareil photo, jetez un oeil à des classes PHPhotoLibrary et la méthode '' creationRequestForAssetFromVideoAtFileURL' de PHAssetChangeRequest' – Nimble

+0

Dans le document ici: https://developer.apple.com/library/prerelease/ios/documentation/Photos/Reference/PHAssetChangeRequest_Class/index.html#//apple_ref/occ/clm/PHAssetChangeRequest/creationRequestForAssetFromVideoAtFileURL, je ne sais pas comprendre ce qu'est fileURL. –

+0

'fileURL' est un lien vers un fichier vidéo. Avez-vous essayé d'utiliser votre 'filePath' en tant que' fileURL'? Il peut ressembler à ceci: 'PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL (NSURL (fileURLWithPath: filePath))' ' – Nimble

Répondre

21

Mise à jour

Voulait mettre à jour la réponse à Swift 3 en utilisant URLSession et compris que la réponse existe déjà dans le sujet connexe here. Utilise le.

Réponse

originale Le code ci-dessous enregistre un fichier vidéo à Camera Roll. J'ai réutilisé votre code avec une modification mineure - j'ai supprimé let fileName = videoImageUrl; car il conduit à un chemin de fichier incorrect.

J'ai testé ce code et il a sauvegardé l'actif dans le rouleau de la caméra. Vous avez demandé à placer dans creationRequestForAssetFromVideoAtFileURL - mettez un lien vers le fichier vidéo téléchargé comme dans l'exemple ci-dessous.

let videoImageUrl = "http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_1mb.mp4" 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
     let url = NSURL(string: videoImageUrl); 
     let urlData = NSData(contentsOfURL: url!); 
     if(urlData != nil) 
     { 
      let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]; 
      let filePath="\(documentsPath)/tempFile.mp4"; 
      dispatch_async(dispatch_get_main_queue(), { 
       urlData?.writeToFile(filePath, atomically: true); 
       PHPhotoLibrary.sharedPhotoLibrary().performChanges({ 
        PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL(NSURL(fileURLWithPath: filePath)) 
       }) { completed, error in 
        if completed { 
         print("Video is saved!") 
        } 
       } 
      }) 
     } 
    }) 
+1

Merci beaucoup! Vous êtes un sauveur de la vie :) –

+0

@Nimble avez-vous une idée que nous pouvons stocker la vidéo directement à la photothèque sans le stocker dans le dossier de documents en premier? – Urmi

+0

Vous enregistrez le fichier dans le répertoire de documents mais il n'est pas supprimé par la suite (au moins, dans ce code). Vous devriez également envisager de nettoyer. Si vous voulez un nettoyage automatique, pourquoi ne pas enregistrer dans le répertoire temp à la place? Ou, si vous le voulez manuellement, faites le nettoyage dans le bloc d'achèvement. – yoninja

10

Swift 3 version du code de @Nimble:

DispatchQueue.global(qos: .background).async { 
    if let url = URL(string: urlString), 
     let urlData = NSData(contentsOf: url) 
    { 
     let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]; 
     let filePath="\(documentsPath)/tempFile.mp4" 
     DispatchQueue.main.async { 
      urlData.write(toFile: filePath, atomically: true) 
      PHPhotoLibrary.shared().performChanges({ 
       PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: URL(fileURLWithPath: filePath)) 
      }) { completed, error in 
       if completed { 
        print("Video is saved!") 
       } 
      } 
     } 
    } 
} 
+0

avez-vous une idée que nous pouvons stocker la vidéo directement à la photothèque sans le stocker dans le dossier de documents en premier? – Urmi

+0

Pas que je sache. Vous devriez regarder la photothèque comme une base de données, donc le téléchargement dans une "base de données" n'a pas de sens. –

+0

Okay. mais vous avez une idée de la quantité de données (Go) que nous pouvons stocker pour une application spécifique. Tout comme WhatsApp stocke toutes les images et vidéos dans la photothèque. En même temps, est-ce qu'il les enregistre dans un dossier de documents? Parce que je développe des images et des vidéos de téléchargement d'applications similaires à partir de sever et les enregistre dans le dossier de documents. – Urmi