蘋果文檔暗示它,但你如何設置AVPlayerItem的loadedTimeRanges屬性的鍵值觀察?該屬性是一個NSArray不會改變,所以你不能只使用playerItem addObserver:self forKeyPath:@"loadedTimeRanges ...
AVPlayerItem.loadedTimeRanges上的KVO是否可能?
或者是否有另一種方式來獲取通知或更新,只要此更改?
蘋果文檔暗示它,但你如何設置AVPlayerItem的loadedTimeRanges屬性的鍵值觀察?該屬性是一個NSArray不會改變,所以你不能只使用playerItem addObserver:self forKeyPath:@"loadedTimeRanges ...
AVPlayerItem.loadedTimeRanges上的KVO是否可能?
或者是否有另一種方式來獲取通知或更新,只要此更改?
其實,我使用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]);
}
}
沒錯。 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));
}
}];
當AVPlayer暫停時,這不會觸發。 – Andy
@安迪不確定你的意思。這對我來說非常合適。暫停時,loadedTimeRanges將停止記錄,但一旦恢復,它們將繼續記錄,並且很明顯,這些值在暫停時仍然在更新。 – user3344977
是的,這是選項,我將它設置爲0.謝謝! –
我逐字嘗試了這個解決方案。不幸的是,我得到一個初始的KVO調用loadedTimeRanges返回一個空的NSArray,然後什麼也沒有。 – GnarlyDog
原來,我可以用於loadedTimeRanges的唯一選項是NSKeyValueObservingOptionInitial。我的工作是在屏幕上顯示UIProgressView時使用Timer(實際上是CADisplayLink)來檢查loadedTimeRanges屬性。這工作,但似乎對我來說很爛。我寧願KVO有任何新的價值。 – GnarlyDog