Уведомление о загрузке AVQueuePlayer / AVPlayer? - PullRequest
7 голосов
/ 07 декабря 2011

У меня есть AVQueuePlayer (который явно расширяет AVPlayer), который загружает список воспроизведения потокового аудио. Потоковое все работает нормально, но я хотел бы иметь индикатор активности, чтобы показать, что пользовательский аудио загружается. Проблема в том, что я не могу найти ни одного такого Уведомления в AVQueuePlayer (или AVPlayer), которое указывало бы, когда аудио-буфер завершил загрузку / готов к воспроизведению (и при этом не существует метода делегата). Есть мысли?

1 Ответ

26 голосов
/ 07 декабря 2011

Вам нужно будет использовать KVO, чтобы сделать это.

Для каждого добавляемого в очередь элемента вы можете настроить наблюдателей следующим образом:

item_ = [[AVPlayerItem playerItemWithURL:[NSURL URLWithString:@"http://somefunkyurl"]] retain];
[item_ addObserver:self forKeyPath:@"status" options:0 context:nil];
[item_ addObserver:self forKeyPath:@"playbackBufferEmpty" options:0 context:nil];

Теперь вы можете оценитьстатус этого элемента в методе наблюдателя;

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([object isKindOfClass:[AVPlayerItem class]])
    {
        AVPlayerItem *item = (AVPlayerItem *)object;
        //playerItem status value changed?
        if ([keyPath isEqualToString:@"status"])
        {   //yes->check it...
            switch(item.status)
            {
                case AVPlayerItemStatusFailed:
                    NSLog(@"player item status failed");
                break;
                case AVPlayerItemStatusReadyToPlay:
                    NSLog(@"player item status is ready to play");
                break;
                case AVPlayerItemStatusUnknown:
                    NSLog(@"player item status is unknown");
                break;
            }
        }
        else if ([keyPath isEqualToString:@"playbackBufferEmpty"])
        {
            if (item.playbackBufferEmpty)
            {
                NSLog(@"player item playback buffer is empty");
            }
        }
    }
}
...