Обнаружение потоковой передачи файлов завершено и готово к воспроизведению с помощью avplayer - PullRequest
0 голосов
/ 08 декабря 2018

Я играю аудиофайл с удаленного сервера с помощью avplayer.Когда я играю это, сначала стрим avplayer с URL, а затем воспроизводить файл.Теперь я просто хочу определить, когда потоковая передача файлов заканчивается и начинается воспроизведение.

Вот мой код:

try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)

player = AVPlayer(url: down_url)
player.addObserver(self, forKeyPath: "status", options: NSKeyValueObservingOptions.new, context: nil)
player.volume = 1.0
player.play()


override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if keyPath == "rate" {
        if player.rate > 0 {
            print("player started")
        }
    }
}

Я использовал этот код для обнаружения, но он напечатал «player player» только один раз, когда avplayer начал потоковую передачу.Но я не могу определить, когда начал играть avplayer.

Ответы [ 2 ]

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

Зарегистрируйте в качестве наблюдателя свойство статуса элемента игрока

playerItem.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.status), options: [.old, .new], context: &playerItemContext)

, и этот метод будет вызываться

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

    // Only handle observations for the playerItemContext
    guard context == &playerItemContext else {
        super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
        return
    }


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

        // Switch over status value
        switch status {
        case .readyToPlay:
            // Player item is ready to play.
            player.play()
            playerControlsView.setPlayerControlsReady()
        case .failed:
            // Player item failed. See error.
            print("Fail")
        case .unknown:
            // Player item is not yet ready.
            print("unknown")
        }
    }

}

Добавить наблюдателя для наблюдения, когда игрок закончит играть

NotificationCenter.default.addObserver(self, selector:#selector(self.playerDidFinishPlaying(note:)),name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem)

Этот метод будет вызываться, когда игрок закончит играть

@objc func playerDidFinishPlaying(note: NSNotification){
        print("Finished Playing")
}

И не забудьте удалить Обозреватель, когда вы закончите с игроком

NotificationCenter.default.removeObserver(self)
0 голосов
/ 09 декабря 2018

Почему вы не пытаетесь скачать файл, а затем воспроизвести его локально?Вы можете использовать Alamofire для обработки загрузки, чтобы вы могли легко узнать, когда загрузка закончится ..

...