Я осмотрелся, но не могу найти протокол делегата для AVPlayer class
. Что дает?
Я использую его подкласс AVQueuePlayer
для воспроизведения массива AVPlayerItems
, каждый из которых загружается из URL. Есть ли способ вызвать метод после окончания воспроизведения песни? Особенно в конце очереди?
И если это невозможно, могу ли я вызвать метод, когда песня НАЧИНАЕТ играть после буферизации? Я пытаюсь вставить значок загрузки, но он отключает значок до того, как музыка фактически начинается, даже если это происходит после [audioPlayer play]
действия.
itemDidFinishPlaying:
, например, с двоеточием. ИзNSNotificationCenter
документации: метод, указанный в notificationSelector, должен иметь один и только один аргумент (экземплярNSNotification
).Да. Добавьте наблюдателя KVO в статус или рейтинг игрока:
- (IBAction)go { self.player = ..... self.player.actionAtItemEnd = AVPlayerActionStop; [self.player addObserver:self forKeyPath:@"rate" options:0 context:0]; } - (void)stopped { ... [self.player removeObserver:self]; //assumes we are the only observer } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (context == 0) { if(player.rate==0.0) //stopped [self stopped]; } else [super observeVal...]; }
В общем, вот и все.
Отказ от ответственности: я написал это здесь, поэтому я не проверял, был ли код хорош. ТАКЖЕ я никогда раньше не использовал AVPlayer, но все должно быть правильно.
источник
Swift 3 - я добавляю наблюдателя
AVPlayerItem
каждый раз, когда добавляю видео в плеер:func playVideo(url: URL) { let playerItem = AVPlayerItem(asset: AVURLAsset(url: someVideoUrl)) NotificationCenter.default.addObserver(self, selector: #selector(playerItemDidPlayToEndTime), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerItem) self.player.replaceCurrentItem(with: playerItem) self.player.play() } func playerItemDidPlayToEndTime() { // load next video or something }
источник
В документации Apple по программированию AVFoundation содержится много информации (ищите раздел мониторинга воспроизведения). Похоже, что в основном это происходит через KVO, поэтому вы можете освежить его в памяти, если вы не слишком знакомы (для этого есть руководство в Руководстве по программированию наблюдения за ключевыми значениями .
источник
Я использую этот, и он работает:
_player = [[AVPlayer alloc]initWithURL:[NSURL URLWithString:_playingAudio.url]]; CMTime endTime = CMTimeMakeWithSeconds(_playingAudio.duration, 1); timeObserver = [_player addBoundaryTimeObserverForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:endTime]] queue:NULL usingBlock:^(void) { [_player removeTimeObserver:timeObserver]; timeObserver = nil; //TODO play next sound }]; [self play];
где
_playingAudio
мой пользовательский класс с некоторыми свойствами иtimeObserver
являетсяid
Ивар.источник