2012-01-25 31 views
5

Tài liệu của Apple ám chỉ nó, nhưng làm thế nào để bạn thiết lập quan sát khóa-giá trị cho thuộc tính loadedTimeRanges của AVPlayerItem? Thuộc tính đó là NSArray không thay đổi, do đó bạn không thể chỉ sử dụng playerItem addObserver:self forKeyPath:@"loadedTimeRanges ...KVO có trên AVPlayerItem.loadedTimeRanges có thể không?

Hoặc có cách nào khác để nhận thông báo hoặc cập nhật bất cứ khi nào thay đổi này không?

Trả lời

6

Thực ra, tôi đang sử dụng KVO cho loadedTimeRanges mà không gặp bất kỳ sự cố nào. Có lẽ bạn chỉ không thiết lập các tùy chọn đúng? Sau đây là một sửa đổi rất nhỏ của một số mã trong của Apple AVPlayerDemo, và nó làm việc khá độc đáo đối với tôi.

//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

Vâng đó là các tùy chọn, tôi đã để nó được đặt thành 0. Cảm ơn! –

+0

Tôi đã thử giải pháp này đúng nguyên văn. Thật không may, tôi nhận được một cuộc gọi KVO ban đầu cho loadTimeRanges trả về một NSArray rỗng và sau đó không có gì. – GnarlyDog

+2

Chỉ ra rằng tùy chọn duy nhất mà tôi có thể làm việc cho loadTimeRanges là NSKeyValueObservingOptionInitial. Công việc xung quanh đối với tôi là sử dụng Timer (CADisplayLink thực sự) để kiểm tra thuộc tính loadedTimeRanges khi UIProgressView xuất hiện trên màn hình. Điều này làm việc nhưng có vẻ kludgy với tôi. Tôi muốn KVO có giá trị mới. – GnarlyDog

2

Phải. loadTimeRanges không thay đổi nhưng các đối tượng bên trong nó thay đổi. Bạn có thể thiết lập một bộ đếm thời gian để chạy mỗi giây (hoặc lâu hơn) và kiểm tra các giá trị bên trong của loadTimeRanges. Sau đó, bạn sẽ thấy những thay đổi bạn đang tìm kiếm.

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

Điều này sẽ không kích hoạt khi AVPlayer tạm dừng mặc dù. – Andy

+0

@Andy Không chắc chắn ý của bạn là gì. Điều này làm việc hoàn hảo cho tôi. Khi tạm dừng loadTimeRanges sẽ ngừng ghi nhật ký nhưng ngay sau khi bạn tiếp tục họ sẽ tiếp tục đăng nhập và nó sẽ được rõ ràng rằng các giá trị vẫn còn được cập nhật trong khi bị tạm dừng. – user3344977

Các vấn đề liên quan