AVPlayer воспроизводит неправильный видеофайл

#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-адреса для воспроизведения.