2012-01-25 57 views
5

蘋果文檔暗示它,但你如何設置AVPlayerItem的loadedTimeRanges屬性的鍵值觀察?該屬性是一個NSArray不會改變,所以你不能只使用playerItem addObserver:self forKeyPath:@"loadedTimeRanges ...AVPlayerItem.loadedTimeRanges上的KVO是否可能?

或者是否有另一種方式來獲取通知或更新,只要此更改?

回答

6

其實,我使用KVO for 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]); 
    } 
} 
+0

是的,這是選項,我將它設置爲0.謝謝! –

+0

我逐字嘗試了這個解決方案。不幸的是,我得到一個初始的KVO調用loadedTimeRanges返回一個空的NSArray,然後什麼也沒有。 – GnarlyDog

+2

原來,我可以用於loadedTimeRanges的唯一選項是NSKeyValueObservingOptionInitial。我的工作是在屏幕上顯示UIProgressView時使用Timer(實際上是CADisplayLink)來檢查loadedTimeRanges屬性。這工作,但似乎對我來說很爛。我寧願KVO有任何新的價值。 – GnarlyDog

2

沒錯。 loadedTimeRanges不會改變,但其內部的對象會改變。你可以設置一個定時器來運行每一秒鐘(或者這樣)並檢查loadedTimeRanges中的值。然後你會看到你正在尋找的變化。

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)); 
             } 
            }]; 
+0

當AVPlayer暫停時,這不會觸發。 – Andy

+0

@安迪不確定你的意思。這對我來說非常合適。暫停時,loadedTimeRanges將停止記錄,但一旦恢復,它們將繼續記錄,並且很明顯,這些值在暫停時仍然在更新。 – user3344977