Невозможно воспроизвести видео с URL с помощью AVPlayer. Ошибка: NSOSStatusErrorDomain Code = -2 - PullRequest
0 голосов
/ 27 февраля 2020

Я использовал библиотеку https://github.com/VeinGuo/VGPlayer для воспроизведения видео в моем пользовательском представлении. Но я столкнулся с ошибкой

Ошибка домена = AVFoundationErrorDomain Code = -11800 «Операция не может быть завершена» UserInfo = {NSLocalizedFailureReason = Произошла неизвестная ошибка (-2), NSLocalizedDescription = Операция не может быть завершено, NSUnderlyingError = 0x281933e40 {Error Domain = NSOSStatusErrorDomain Code = -2 "(null)"}}

Я только что реализовал Вставить в ячейку tableView в моем проекте из примера GitHub. Для получения причины ошибки я только что создал новый пустой проект и делаю то же самое в этом, и я просто шокирован. В этом все работает нормально (то же устройство, тот же xcode). Я много исследовал, но не смог найти реальную проблему в моем проекте. Пожалуйста, помогите мне!

Я использовал этот URL для воспроизведения видео. Он отлично работает в моем новом проекте, но не в моем реальном.

Ниже приведен метод addPlayer из файла VGEmbedTableViewController. и другой код такой же, как в примере с репозиторием gitHub. Я только изменил URL.

    func addPlayer(_ cell: UITableViewCell) {
    if player != nil {
        player.cleanPlayer()
    }
    configurePlayer()
    cell.contentView.addSubview(player.displayView)
    player.displayView.snp.makeConstraints {
        $0.edges.equalTo(cell)
    }
    player.replaceVideo(URL(string:"https://s3.eu-west-2.amazonaws.com/gymstar-app/7A77786B4870594D7165625046614E74/post_videos/postVideo1582781434.005436.mp4")!)
    player.play()
}

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Моя проблема решена путем очистки кэша, который сохраняется библиотекой VGPlayer. Они предоставляют методы для очистки кэша и удаления файлов,

    open func cleanAllCache() {
    ioQueue.sync {
        do {
            let cacheDirectory = VGPlayerCacheManager.cacheDirectory()
            try fileManager.removeItem(atPath: cacheDirectory)
        } catch { }
    }
}

open func cleanOldFiles(completion handler: (()->())? = nil) {
    ioQueue.sync {
        let cacheDirectory = VGPlayerCacheManager.cacheDirectory()
        var (URLsToDelete, diskCacheSize, cachedFiles) = self.cachedFiles(atPath: cacheDirectory, onlyForCacheSize: false)

        for fileURL in URLsToDelete {
            do {
                try fileManager.removeItem(at: fileURL)
            } catch _ { }
        }

        if cacheConfig.maxCacheSize > 0 && diskCacheSize > cacheConfig.maxCacheSize {
            let targetSize = cacheConfig.maxCacheSize / 2

            let sortedFiles = cachedFiles.keysSortedByValue {
                resourceValue1, resourceValue2 -> Bool in

                if let date1 = resourceValue1.contentAccessDate,
                    let date2 = resourceValue2.contentAccessDate
                {
                    return date1.compare(date2) == .orderedAscending
                }

                return true
            }

            for fileURL in sortedFiles {
                let (_, cacheSize, _) = self.cachedFiles(atPath: fileURL.path, onlyForCacheSize: true)
                diskCacheSize -= cacheSize

                do {
                    try fileManager.removeItem(at: fileURL)
                } catch { }

                URLsToDelete.append(fileURL)

                if diskCacheSize < targetSize {
                    break
                }
            }
        }

        DispatchQueue.main.async {

            if URLsToDelete.count != 0 {
                let cleanedHashes = URLsToDelete.map { $0.lastPathComponent }
                NotificationCenter.default.post(name: .VGPlayerCacheManagerDidCleanCache, object: self, userInfo: [VGPlayerCacheManager.VGPlayerCleanCacheKey: cleanedHashes])
            }

            handler?()
        }
    }
}
0 голосов
/ 27 февраля 2020

Я использовал простой быстрый код для воспроизведения контента.

func play() {
    // Get AVPlayerItem


    let url = URL(string:"https://s3.eu-west-2.amazonaws.com/gymstar-app/7A77786B4870594D7165625046614E74/post_videos/postVideo1582781434.005436.mp4")


    //let url = URL(string:"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8")



    self.asset = AVURLAsset(url: url!)
    self.playerItem = AVPlayerItem(asset: asset!)

    // Get AVPlayer
    self.player = AVPlayer(playerItem: self.playerItem)

    self.playerViewController = AVPlayerViewController()
    self.playerViewController!.player = self.player;

    self.present(self.playerViewController!, animated: true) {
        self.player?.play()
    }
}
...