Rozejrzałem się, ale nie mogę znaleźć protokołu delegata dla AVPlayer class
. Co daje?
Używam jego podklasy, AVQueuePlayer
aby odtworzyć tablicę, z AVPlayerItems
których każda jest ładowana z adresu URL. Czy istnieje sposób, w jaki mogę wywołać metodę, gdy piosenka zakończy się odtwarzać? Zwłaszcza na końcu kolejki?
A jeśli to niemożliwe, czy jest jakiś sposób, abym mógł wywołać metodę, gdy piosenka ZACZYNA SIĘ odtwarzać po buforowaniu? Próbuję umieścić tam ikonę ładowania, ale wyłącza ją przed rozpoczęciem odtwarzania muzyki, nawet jeśli jest po [audioPlayer play]
akcji.
itemDidFinishPlaying:
, np. Z okrężnicą. ZNSNotificationCenter
dokumentacji: Metoda określona przez notificationSelector musi mieć jeden i tylko jeden argument (wystąpienieNSNotification
).Tak. Dodaj obserwatora KVO do statusu lub stawki gracza:
- (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...]; }
Więc w zasadzie to wszystko.
Zastrzeżenie: napisałem to tutaj, więc nie sprawdziłem, czy kod jest dobry. TAKŻE nigdy wcześniej nie używałem AVPlayera, ale powinno być dobrze.
źródło
Swift 3 - dodaję obserwatora za
AVPlayerItem
każdym razem, gdy dodaję wideo do odtwarzacza: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 }
źródło
Wiele informacji można znaleźć w Przewodniku programowania AVFoundation firmy Apple (poszukaj sekcji odtwarzania monitorowania). Wydaje się, że odbywa się to głównie przez KVO, więc możesz chcieć odświeżyć to, jeśli nie jesteś zbyt zaznajomiony (istnieje przewodnik po tym, jak Key Value Observing ProgrammingGuide) .
źródło
Używam tego i działa:
_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];
gdzie
_playingAudio
jest moja niestandardowa klasa z niektórymi właściwościami itimeObserver
jestid
ivar.źródło