Неэффективно ли устанавливать дубликат avqueueplayer в качестве AVPlayer, чтобы я мог наблюдать за изменением стоимости? - PullRequest
0 голосов
/ 02 июля 2019

Мне интересно, действительно ли следующий способ является лучшим способом узнать, когда видео готово к воспроизведению: в настоящее время я if currentMedia.playerQueue?.status.rawValue == 1 { играю, else (видео еще не загружено). Я покажу значок загрузки.а затем выполните следующие действия, чтобы определить, когда видео будет готово к воспроизведению:

Я создаю AVPlayer, используя тот же URL-адрес видео, а затем, когда он будет готов, я вызову метод playCurentMedia () для воспроизведения vid.

currentMedia.avPlayer = AVPlayer(url: currentMedia.videoURL!)

currentMedia.avPlayer!.addObserver(self, forKeyPath: "status", options: [.new, .initial], context: &P2SheetViewController.playerStatusContext)

Есть ли у этой стратегии какие-либо недостатки?Или это хорошее решение?

Как я могу наблюдать за изменениями, чтобы я мог показать видео, когда оно будет готово?

В настоящее время ятолько в состоянии настроить AVPlayer рядом с очередью, чтобы я мог наблюдать за его изменением ...

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    print("observe KVO")
    // Only handle observations for the playerItemContext
    guard context == &P2SheetViewController.playerStatusContext else {
        super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
        return
    }

    if keyPath == #keyPath(AVPlayer.status) {
        let status: AVPlayer.Status
        if let statusNumber = change?[.newKey] as? NSNumber {
            status = AVPlayer.Status(rawValue: statusNumber.intValue)!
        } else {
            status = .unknown
        }

        //Switch over status value
        switch status {
        case .readyToPlay:
            print("READY TO PLAY")
            GlobalSharedData.shared.videoAllSetToGoMedia1 = true

            if GlobalSharedData.shared.p2Media1VideoWasNotReadyWhenPressedView {
                baseVC.playVideoControlForP2()
            }

            break
        // Player item is ready to play.
        case .failed:
            print(".UKNOWN")

            break
        // Player item failed. See error.
        case .unknown:
            print(".UKNOWN")

            break
            // Player item is not yet ready.
        }

    }
}
...