Swift – 从远端URL下载video并保存在相册中

我目前在我的应用程序中显示video,我希望用户能够将其保存到其设备图库/相册照片/相机胶卷。 这是我在做什么,但video不保存在相册中:/

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

我也看看这个:

 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) 

但是我有错误“无法从文件创build数据(空)”。 我的“assetChangeRequest”是零。 我不明白,因为我的url是有效的,当我去浏览器,它下载一个快速的时间文件。

如果任何人都可以帮助我,这将不胜感激! 我正在使用Swift和iOS 8.0分钟。

更新

想要使用URLSession来更新Swift 3的答案,并且发现在这里的相关主题中已经存在答案。 用它。

原始答复

下面的代码将video文件保存到相机胶卷。 我重复使用你的代码进行了一些小改动 – 我删除了let fileName = videoImageUrl; 因为它导致不正确的文件path。

我testing了这个代码,并将资产保存到相机胶卷中。 你问什么要放入creationRequestForAssetFromVideoAtFileURL – 把下载的video文件的链接,如下面的例子。

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

来自@Nimble的Swift 3版本的代码:

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