Возможно ли KVO на AVPlayerItem.loadedTimeRanges? - PullRequest
5 голосов
/ 25 января 2012

Документация по яблокам ссылается на него, но как настроить наблюдение значения ключа для свойстваloadedTimeRanges объекта AVPlayerItem?Это свойство является NSArray, которое не изменяется, поэтому вы не можете просто использовать playerItem addObserver:self forKeyPath:@"loadedTimeRanges ...

. Или есть ли другой способ получать уведомления или обновления при каждом изменении?

Ответы [ 2 ]

7 голосов
/ 12 мая 2012

На самом деле, я использую KVO дляloadedTimeRanges без каких-либо проблем.Может быть, вы просто не устанавливаете правильные параметры?Ниже приведена очень небольшая модификация некоторого кода в Apple AVPlayerDemo , и он прекрасно работает для меня.

//somewhere near the top of the file
NSString * const kLoadedTimeRangesKey   = @"loadedTimeRanges";
static void *AudioControllerBufferingObservationContext = &AudioControllerBufferingObservationContext;


- (void)someFunction
{  
    // ...

    //somewhere after somePlayerItem has been initialized
    [somePlayerItem addObserver:self
                       forKeyPath:kLoadedTimeRangesKey
                          options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
                          context:AudioControllerBufferingObservationContext];

    // ...
}

- (void)observeValueForKeyPath:(NSString*) path 
                  ofObject:(id)object 
                    change:(NSDictionary*)change 
                   context:(void*)context
{
    if (context == AudioControllerBufferingObservationContext)
    {
        NSLog(@"Buffering status: %@", [object loadedTimeRanges]);
    }
}
2 голосов
/ 05 мая 2012

правый. Загруженное время не изменяется, но объекты внутри него меняются. Вы можете настроить таймер для запуска каждую секунду (или около того) и проверять значения внутри загруженного времени. Тогда вы увидите изменения, которые вы ищете.

dispatch_queue_t queue = dispatch_queue_create("playerQueue", NULL);

[player addPeriodicTimeObserverForInterval:CMTimeMake(1, 1)
                                          queue:queue
                                     usingBlock:^(CMTime time) {  
                                         for (NSValue *time in player.currentItem.loadedTimeRanges) {
                                             CMTimeRange range;
                                             [time getValue:&range];
                                             NSLog(@"loadedTimeRanges: %f, %f", CMTimeGetSeconds(range.start), CMTimeGetSeconds(range.duration));
                                         }
                                     }];
...