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!") } } } } } 
  • Делегат на языке Swift
  • Удаленный класс падает сообщение об ошибке неизвестно>: 0: ошибка: нет такого файла или каталога:
  • Как конвертировать Int в Double в Swift playground?
  • Есть что-то в Swift, как LINQ в C #
  • Как передать данные в диспетчер представлений и загрузить их, прежде чем нажимать их на стек навигации?
  • Как получить доступ к UITableViewCell из UITableView в другом UIViewController?
  • Знаете, когда слабый var становится ничтожным в Свифте?
  • Swift2: Невозможно вызвать инициализатор для типа 'NSString'
  • Создание и хранение PDF-документа программно с помощью Swift для iOS
  • Ошибка «Приложение попыталось представить контроллер модального просмотра сам по себе» при активации UISearchController при действии
  • Почему я получаю недопустимое объявление с использованием фреймворка?
  • Interesting Posts

    Как вы видите только тень за пределами поля UIView?

    «Множественные ключи, которые не допускаются сюда» с предикатом

    Задержка при использовании метода instantiateViewControllerWithIdentifier, но не выполнение функции SigueWithIdentifier?

    Можете ли вы изменить то, что отображается при изменении ориентации в сафари для iOS?

    Как я могу нарисовать один круг вокруг каждого места касания на устройстве?

    Ошибка приложения с ошибкой Ошибка утверждения в пустоте PushNextClassForSettingIMP (id, SEL) () в> = iOS 9.3.1

    Можно ли вызвать тактическую обратную связь без сопровождающего звука на apple Watch OS 2

    iOS tableview задерживается при прокрутке при загрузке изображения в изображение

    iOS открывает приложение YouTube с запросом (схемы URL)

    Получение ошибки " Событие неверно" при запуске приложения ARKit

    Swift tableView Pagination

    Можно ли интегрировать Stripe With Firebase и iOS?

    Интеграция платежей Sagepay ios

    UIView: layoutSubviews vs initWithFrame

    ограничение установки одновременных задач в AFNetworking 2 с запуском AFHTTPSessionManager

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.