web-dev-qa-db-fra.com

Swift - Téléchargez une vidéo à partir d'une URL distante et enregistrez-la dans un album photo

J'affiche actuellement une vidéo dans mon application et je souhaite que l'utilisateur puisse l'enregistrer dans sa galerie d'appareils/album photo/pellicule. Voici ce que je fais mais la vidéo n'est pas enregistrée dans l'album: /

    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");
            })

        }
    })

}

Je vais aussi regarder ça:

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 j'ai l'erreur "Impossible de créer des données à partir du fichier (null)". Mon "assetChangeRequest" est nul. Je ne comprends pas car mon URL est valide et lorsque j'y vais avec un navigateur, elle télécharge un fichier Quick Time.

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

14
Melanie Journe

Mise à jour

Je voulais mettre à jour la réponse pour Swift 3 en utilisant URLSession et compris que la réponse existe déjà dans le sujet connexe ici . Utilisez-le.

Réponse originale

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

J'ai testé ce code et il a enregistré l'actif dans la pellicule. Vous avez demandé quoi 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"

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!")
                }
            }
        }
    }
}
26
Nimble

Version Swift 3 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!")
                }
            }
        }
    }
}
12
Yuval Tal
PHPhotoLibrary.shared().performChanges({
     PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: video.url!)}) {
     saved, error in
     if saved {
          print("Save status SUCCESS")
     }
}
0