2012-01-25 3 views
5

사과 설명서에 언급되어 있지만, AVPlayerItem의 loadedTimeRanges 속성에 대한 키 - 값 관찰을 설정하는 방법은 무엇입니까? 이 속성은 변경되지 않는 NSArray이므로 사용할 수 없습니다. playerItem addObserver:self forKeyPath:@"loadedTimeRanges ...AVPlayerItem.loadedTimeRanges에서 KVO를 사용할 수 있습니까?

또는 변경 될 때마다 알림이나 업데이트를받을 수있는 다른 방법이 있습니까?

답변

6

실제로, 나는 문제가없는 loadTimeRanges에 대해 KVO를 사용하고 있습니다. 아마도 올바른 옵션을 설정하지 않은 것일까 요? 다음은 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

나는이 해결책을 그대로 시도했다. 불행히도, 빈 NSArray를 반환 한 다음 아무것도 반환하지 않는 loadedTimeRanges에 대한 초기 KVO 호출을 얻습니다. – GnarlyDog

+2

loadedTimeRanges에서 작동하도록 할 수있는 유일한 옵션은 NSKeyValueObservingOptionInitial뿐이었습니다. 저를위한 해결책은 UIProgressView가 화면에있을 때 loadedTimeRanges 속성을 확인하기 위해 실제로 Timer (CADisplayLink)를 사용하는 것이 었습니다. 이 작품은 나에게 kludgy 보이지만 않습니다. 나는 새로운 가치를 KVO 싶습니다. – GnarlyDog

2

오른쪽. loadedTimeRanges는 변경되지 않지만 내부의 객체는 변경됩니다. 매초마다 실행되도록 timer를 설정하고 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

@Andy 무슨 뜻인지 모르겠다. 이것은 나를 위해 완벽하게 작동합니다. 일시 중지되면 loadedTimeRanges는 로깅을 중지하지만 다시 시작하면 즉시 로깅되며 일시 중지 된 상태에서 값이 계속 업데이트되고 있음을 알 수 있습니다. – user3344977

관련 문제