2

初期化時に 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 です。

4

0 に答える 0