J'ai regardé autour de moi mais je ne trouve pas de protocole de délégué pour le AVPlayer class
. Ce qui donne?
J'utilise sa sous-classe,, AVQueuePlayer
pour lire un tableau de AVPlayerItems
, chacun chargé à partir d'une URL. Puis-je appeler une méthode à la fin de la lecture d'une chanson? Notamment à la fin de la file d'attente?
Et si ce n'est pas possible, est-ce que je pourrais appeler une méthode lorsque la chanson COMMENCE à jouer, après la mise en mémoire tampon? J'essaie d'y insérer une icône de chargement, mais cela désactive l'icône avant que la musique ne commence réellement, même si c'est après l' [audioPlayer play]
action.
itemDidFinishPlaying:
, par exemple avec deux-points. De laNSNotificationCenter
documentation: La méthode spécifiée par notificationSelector doit avoir un et un seul argument (une instance deNSNotification
).Oui. Ajouter un observateur KVO au statut ou au taux du joueur:
- (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...]; }
Donc, fondamentalement, c'est tout.
Avertissement: je l'ai écrit ici, donc je n'ai pas vérifié si le code était bon. AUSSI, je n'ai jamais utilisé AVPlayer auparavant, mais cela devrait être à peu près correct.
la source
Swift 3 - J'ajoute un observateur à
AVPlayerItem
chaque fois que j'ajoute une vidéo au lecteur: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 }
la source
Il y a beaucoup d'informations dans le guide de programmation d' Apple docs AVFoundation (recherchez la section de lecture de surveillance). Il semble que ce soit principalement via KVO, donc vous voudrez peut-être revoir cela si vous n'êtes pas trop familier (il existe un guide pour cela dans le guide de programmation d'observation des valeurs clés .
la source
J'utilise celui-ci, et ça marche:
_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];
où
_playingAudio
est ma classe personnalisée avec quelques propriétés ettimeObserver
estid
ivar.la source