#ios #swift #caching #avfoundation #avplayer
#iOS #быстрый #кэширование #основание #avplayer
Вопрос:
У меня странная ситуация , и я понятия не имею , как с этим справиться , я загружаю видео из firestorage и кэширую в устройство для дальнейшего использования, тем временем фоновый поток уже выполняет свою работу, я передаю URL-адрес видео функции для воспроизведения видео. Проблема в том, что иногда avplayer воспроизводит правильное видео, а иногда берет какой-то другой URL-адрес видео из кэша.
вы можете найти код ниже :
func cacheVideo(for exercise: Exercise) { print(exercise.imageFileName) guard let filePath = filePathURL(for: exercise.imageFileName) else { return } if fileManager.fileExists(atPath: filePath.path) { // print("already exists") } else { exercise.loadRealURL { (url) in print(url) self.getFileWith(with: url, saveTo: filePath) } } }
запись файла здесь
func getFileWith(with url: URL, saveTo saveFilePathURL: URL) { DispatchQueue.global(qos: .background).async { print(saveFilePathURL.path) if let videoData = NSData(contentsOf: url) { videoData.write(to: saveFilePathURL, atomically: true) DispatchQueue.main.async { // print("downloaded") } } else { DispatchQueue.main.async { let error = NSError(domain: "SomeErrorDomain", code: -2001 /* some error code */, userInfo: ["description": "Can't download video"]) print(error.debugDescription) } } } }
теперь воспроизводим видео с помощью этого
func startPlayingVideoOnDemand(url : URL) { activityIndicatorView.startAnimating() activityIndicatorView.isHidden = false print(url) let cachingPlayerItem = CachingPlayerItem(url: url) cachingPlayerItem.delegate = self cachingPlayerItem.download() // cachingPlayerItem.preferredPeakBitRate = 0 let avasset = AVAsset(url: url) let playerItem = AVPlayerItem(asset: avasset) let player = AVPlayer(playerItem: playerItem) player.automaticallyWaitsToMinimizeStalling = false initializeVideoLayer(for: player) }
любые предложения будут высоко оценены.
Комментарии:
1. Вы можете дважды проверить URL-адрес, по которому вызывается функция : функция startPlayingVideoOnDemand(url : URL) в обоих случаях, и разница, вероятно, может заключаться в разных URL-адресах в двух сценариях.
2. Я уже все исправил, спасибо
Ответ №1:
это было решено, потому что модель данных, которую я использовал для загрузки множества видеофайлов, была доступна в фоновом потоке, а тем временем я пытался присвоить URL-адрес тому же классу модели данных, чтобы извлечь видео и воспроизвести его в avplayer. Следовательно, это была проблема, и она была решена простым добавлением нового атрибута в модель данных для немедленного назначения URL-адреса для воспроизведения.