Уведомление AVPlayerItemDidPlayToEndTime не срабатывает при потоковой передаче через AirPlay - PullRequest
2 голосов
/ 16 апреля 2019

Я использую AVPlayer для воспроизведения простого видео MP4. Поскольку мне нужно знать, когда видео заканчивается, я добавляю наблюдателя для уведомления AVPlayerItemDidPlayToEndTime.

Это нормально работает, если видео воспроизводится на устройстве, но уведомление никогда не публикуется, если мы транслируем видео с устройства на Apple TV (4-го поколения) с tvOS 12.2 через AirPlay.

Странно, эта проблема возникает только с видео MP4, а не с потоками HLS (m3u8), что заставляет меня задуматься, может ли это быть ошибка в tvOS (или AirPlay).

Я создал небольшой POC, чтобы изолировать проблему, и вот что я делаю:

let bunny = "https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4"

// create a new player with every call to startVideo() for demo purposes
func startVideo() {

    // remove layer of current play from playerContainer as
    // a new one will be created below
    if let sublayers = playerContainer.layer.sublayers {
        for layer in sublayers {
            layer.removeFromSuperlayer()
        }
    }

    if let videoUrl = URL(string: bunny) {
        // create player with sample video URL
        self.player = AVPlayer(url: videoUrl)

        guard let player = self.player else {return}

        // add player layer to playerContainer
        let playerLayer = AVPlayerLayer(player: player)
        playerLayer.frame = playerContainer.bounds
        playerLayer.videoGravity = .resizeAspectFill
        playerContainer.layer.addSublayer(playerLayer)

        // add block-based observer to listen for AVPlayerItemDidPlayToEndTime event
        let _ = NotificationCenter.default.addObserver(forName: NSNotification.Name.AVPlayerItemDidPlayToEndTime,
                                                       object: player.currentItem,
                                                       queue: .main) { notification in
            print("Item did finish playing! \(notification)")
        }

        player.play()
    }
}

Просто чтобы еще раз уточнить, это прекрасно работает , если одно из следующих условий true :

  • Видео воспроизводится на устройстве, и AirPlay не задействован.
  • Видео транслируется на AppleTV 3-го поколения.
  • HLS вместо видео MP4 используется.

Я также попробовал следующие вещи, но результат был тот же:

  • Не устанавливайте currentItem как объект при добавлении наблюдателя.
  • Не указывать очередь при добавлении наблюдателя.
  • Не используйте блочный, а селекторный метод для добавления наблюдателя.

Любая помощь приветствуется. Это может быть дубликатом этого вопроса , но поскольку ответов нет, и связанный вопрос касается HLS, а не MP4, я решил все же опубликовать этот вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...