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