初期化時に AVQueuePlayer アイテムを KVO に登録しようとしました。以下の項目itemArray
はすべて、URL を使用して適切に作成されています。コードの後、queueList が AVQueuePlayer に追加されます。プレーヤーは、各アイテムが順番に再生されて正常に再生されますが、最初のアイテムのオブザーバーのみが応答をトリガーします。AVPlayerItemDidPlayToEnd
ただし、すべてのアイテムで機能します。
KVO初心者です。どんな助けでも大歓迎です。
for(AVPlayerItem *i in itemArray)
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(nextSong)
name:AVPlayerItemDidPlayToEndTimeNotification object:i];
[i addObserver:self forKeyPath:@"status" options:0 context:nil];
[i addObserver:self forKeyPath:@"playbackBufferEmpty" options:0 context:nil];
[i addObserver:self forKeyPath:@"playbackLikelyToKeepUp" options:0 context:nil];
[queueList addObject:item];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
AVPlayerItem *thisItem = (AVPlayerItem *)object;
if ([keyPath isEqualToString:@"rate"]) {
if ([self.player rate]!=0) {
[self setPlayButtonAsPlaying:YES];
NSLog(@"PLAYING");
}
else {
[self setPlayButtonAsPlaying:NO];
NSLog(@"PAUSED");
}
}
else if ([keyPath isEqualToString:@"status"])
{
if(thisItem.status==AVPlayerItemStatusFailed)
{
NSLog(@"failed");
[self setPlayButtonAsPlaying:NO];
[player pause];
}
}
else if ([keyPath isEqualToString:@"playbackBufferEmpty"])
{
if(thisItem.playbackBufferEmpty)
{
[player pause];
[self setPlayButtonAsPlaying:NO];
}
}
else if ([keyPath isEqualToString:@"playbackLikelyToKeepUp"])
{
if(!thisItem.playbackLikelyToKeepUp)
{
[player pause];
[self setPlayButtonAsPlaying:NO];
}
else
{
[player play];
[self setPlayButtonAsPlaying:YES];
}
}
}
編集: このコマンドをトリガーするボタンもあり、これらのプロパティの状態をテストするために使用します。
NSLog(player.currentItem.playbackBufferEmpty ? @"Yes" : @"No");
NSLog(player.currentItem.playbackLikelyToKeepUp ? @"Yes" : @"No");
具体的には、playbackLikelyToKeepUp が false です (wifi を切断して手動で発生させます)。興味深いことに、playBackBufferEmpty も false です。