Swift – загрузка видео с удаленного URL и сохранение его в фотоальбоме

В настоящее время я показываю видео в своем приложении, и я хочу, чтобы пользователь мог сохранить его в галерее своего устройства / альбоме / ролике камеры. Вот что я делаю, но видео не сохраняется в альбоме: /

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) 

Но у меня есть ошибка «Невозможно создать данные из файла (null)». Мой «assetChangeRequest» равен нулю. Я не понимаю, как мой url действителен, и когда я перехожу к нему с помощью браузера, он загружает быстрый файл времени.

Если кто-нибудь может мне помочь, это будет оценено! Я использую Swift и настраиваю iOS 8.0 мин.

2 Solutions collect form web for “Swift – загрузка видео с удаленного URL и сохранение его в фотоальбоме”

Обновить

Требуется обновить ответ для Swift 3 с помощью URLSession и выяснил, что ответ уже существует в связанной теме. Используй это.

Оригинальный ответ

Код ниже сохраняет видеофайл в Camera Roll. Я повторно использовал ваш код с небольшими изменениями – я удалил let fileName = videoImageUrl; потому что это приводит к неправильному пути к файлу.

Я протестировал этот код и сохранил его в ролике. Вы спросили, что добавить в creationRequestForAssetFromVideoAtFileURL – поместите ссылку на загруженный видеофайл, как в приведенном ниже примере.

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

Swift 3 версии кода от @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!") } } } } } 
  • Удалить файлы из каталога внутри каталога документа?
  • Alamofire download progress totalBytesExpectedToRead always -1
  • Попадание к определенному диспетчеру просмотра в стеке навигации
  • Оператор | не может применяться к двум операндам «PFLoginFields» Swift
  • Добавление внутренней тени к вершине UIView
  • создание zip-файла из строки в swift
  • Проблемы с размером экрана объектива ios 9
  • Как я могу хранить свои данные локально с помощью iOS + Swift?
  • Найти процесс загрузки файла в быстром
  • proximityMonitoring может не работать должным образом
  • Создание экземпляров классов, хранящихся в метатипах Словарь
  • Получение всех файлов cookie из WKWebView
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.