Сохранить потоковое видео (файл m3u8) в галерее - PullRequest
0 голосов
/ 26 декабря 2018

Когда я загружаю проигрыватель .mp4 или .mov, он безошибочно сохраняет в галерею устройств, но когда я пытаюсь сохранить видеофайл .m3u8, он всегда выдаёт мне эту ошибку в локальном описании ошибки:

"Необязательно (Ошибка домена = NSCocoaErrorDomain Code = -1 \" (null) \ ")"

Может кто-нибудь мне помочь, откуда я ошибаюсь?

 func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask,
                didFinishDownloadingTo location: URL) {
    // 1
    guard let sourceURL = downloadTask.originalRequest?.url else { return }
    let download = DownloadManager.sharedDownloadManager.activeDownloads[sourceURL]
    DownloadManager.sharedDownloadManager.activeDownloads[sourceURL] = nil
    // 2
    let destinationURL = localFilePath(for: sourceURL)
    print(destinationURL)

    PHPhotoLibrary.shared().performChanges({
        PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: destinationURL)
    }) { saved, error in
        if saved {
            print("Video saved")
           download?.track.downloaded = true
        }else{
            print("Video not saved")
            download?.track.downloaded = false
        }
    }
}

1 Ответ

0 голосов
/ 26 декабря 2018

При загрузке видео вы получаете видео, сохраненное во временный путь.После завершения загрузки переместите видео с временного пути в каталог вашего приложения. отметьте здесь

Он использовал этот код для загрузки видео, он прекрасно работает для меня

Вам просто нужно передать ссылку на видео в функции.Я использовал форматировщик даты для обозначения видео, загруженного с сервера.Потому что после загрузки первого видео ваше старое видео будет заменено, если вы не использовали соглашение об именах.

func downloadVideoLinkAndCreateAsset(_ videoLink: String) {
    DispatchQueue.main.async {
        self.view.makeToast("Downloading Video", duration: 0.8, position: .center)
    }

    guard let videoURL = URL(string: videoLink) else { return }
    guard let documentsDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }

    URLSession.shared.downloadTask(with: videoURL) { (location, response, error) -> Void in
        guard let location = location else { return }
        let date = Date()
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "HH:mm:ss"
        dateFormatter.timeZone = TimeZone(identifier: "GMT")
        let destinationURL = documentsDirectoryURL.appendingPathComponent("\(dateFormatter.string(from: date)).mp4")
        do {
            try FileManager.default.moveItem(at: location, to: destinationURL)
            PHPhotoLibrary.shared().performChanges({
                PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: destinationURL)}) { completed, error in
                    if completed {
                        //Downloaded
                    } else if let error = error {
                        //Error
                    }
            }
        } catch {
            print(error.localizedDescription)
        }
        }.resume()
}

Целевой URL - это URL-адрес каталога вашего проекта

...