Нет делегата AVPlayer? Как отслеживать воспроизведение песни? Цель развития iPhone
Я огляделся, но не могу найти делегатский протокол для AVPlayer class
. Что дает?
Я использую свой подкласс AVQueuePlayer
для воспроизведения массива AVPlayerItems
, каждый из которых загружается из URL-адреса. Есть ли способ вызвать метод, когда песня заканчивается? Примечательно, что в конце очереди?
И если это невозможно, можно ли каким-либо образом вызвать метод, когда песня STARTS будет играть, после буферизации? Я пытаюсь получить значок загрузки там, но он отключает значок до начала музыки, даже если он после действия [audioPlayer play]
.
Ответы
Ответ 1
Да, класс AVPlayer не имеет протокола делегата, такого как AVAudioPlayer. Вам необходимо подписаться на уведомления в AVPlayerItem. Вы можете создать AVPlayerItem, используя тот же URL-адрес, который в противном случае вы передали бы -initWithURL:
на AVPlayer.
-(void)startPlaybackForItemWithURL:(NSURL*)url {
// First create an AVPlayerItem
AVPlayerItem* playerItem = [AVPlayerItem playerItemWithURL:url];
// Subscribe to the AVPlayerItem DidPlayToEndTime notification.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem];
// Pass the AVPlayerItem to a new player
AVPlayer* player = [[[AVPlayer alloc] initWithPlayerItem:playerItem] autorelease];
// Begin playback
[player play]
}
-(void)itemDidFinishPlaying:(NSNotification *) notification {
// Will be called when AVPlayer finishes playing playerItem
}
Ответ 2
Да. Добавьте наблюдателя 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, но это должно быть правильно.
Ответ 3
В документах Apple "Руководство по программированию AVFoundation" содержится много информации (смотрите раздел "Мониторинг воспроизведения" ). Похоже, что это в основном с помощью KVO, поэтому вы можете на это поправить, если вы не слишком знакомы (для этого есть руководство для Key Value Observing ProgrammingGuide.
Ответ 4
Я использую этот, и он работает:
_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
ivar.
Ответ 5
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
}