Я использую 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, я решил все же опубликовать этот вопрос.