2011-09-14 20 views
15

Tôi có trình phát âm thanh mà tôi đang tạo bằng AVPlayer.AVPlayer replaceCurrentItemWithPlayerNó không hoạt động trên iOS 4.3.3+

Hiện tại, tôi giữ phiên bản player xung quanh và khi cần trao đổi bản nhạc (từ lựa chọn thủ công hoặc bản nhạc đến cuối) Tôi tạo AVPlayerItem mới và tôi gọi replaceCurrentItemWithPlayerItem bằng mặt hàng mới.

Theo tài liệu, replaceCurrentItemWithPlayerItem là một hoạt động không đồng bộ, vì vậy tôi cũng quan sát đường dẫn chính currentItem của trình phát. Khi được gọi, tôi bảo người chơi của mình chơi.

Đây là mã có liên quan:

AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; 
[playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:CHStreamingAudioPlayer_PlayerItemStatusChangedContext]; 

if (!_player) { 
    _player = [[AVPlayer alloc] initWithPlayerItem:playerItem]; 
    [_player addObserver:self forKeyPath:@"status"   options:NSKeyValueObservingOptionNew context:CHStreamingAudioPlayer_PlayerStatusChangedContext]; 
    [_player addObserver:self forKeyPath:@"currentItem"  options:NSKeyValueObservingOptionNew context:CHStreamingAudioPlayer_PlayerCurrentItemChangedContext]; 
} else { 
    [_player replaceCurrentItemWithPlayerItem:playerItem]; 
} 

Và đây là chìa khóa gọi lại giá trị quan sát:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if (context == CHStreamingAudioPlayer_PlayerCurrentItemChangedContext) { 
     NSLog(@"Player's current item changed! Change dictionary: %@", change); 
     if (_player.currentItem) { 
      [self play]; //<---- doesn't get called 
     } 
    } else { 
     [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 
    } 
} 

Trên iOS 4.3.3 (và iOS 5) Phương pháp quan sát quan trọng của tôi được gọi nhưng _player.currentItem luôn là nil. Trên 4.2.1 và 4.3.2 thuộc tính này chứa giá trị thực. Phương pháp này không bao giờ được gọi lại. Vì vậy, về bản chất, thay thế dường như luôn thất bại.

Điều này có vẻ giống như một lỗi, nhưng có lẽ tôi đang làm điều gì sai.

+0

Câu trả lời dưới đây của Dunja có giải quyết được sự cố của bạn không? –

Trả lời

17

Tôi gặp sự cố này với iOS 5 (bao gồm 5.0.1). Nó được sử dụng để hoạt động tốt trên iOS 4.x.

Có hai cách để giải quyết vấn đề này, giải phóng và tạo lại AVPlayer của bạn với mong muốn AVPlayerItem mỗi lần bạn cần trao đổi bản nhạc. Hoặc, chỉ cần gọi replaceCurrentItemWithPlayerItem: trên chuỗi chính.

Tôi đã thử cả hai tùy chọn và chúng hoạt động tốt.

Tín dụng cho: Apple Developer Forums

+0

Chạy trên chủ đề chính đã sửa lỗi cho tôi. – vaughan

1

Tôi đã gặp sự cố tương tự. Bạn có thể đã bắt đầu từ AVPlayerDemoPlaybackViewController from Apple sample code như tôi. Có lẽ vấn đề tại sao currentItemnil là do nó chưa được tải hoặc sẵn sàng phát lại (vấn đề của tôi là tôi không thể nhận được thời lượng mới AVPlayerItem).

Bạn có thể thử bắt đầu phát lại khi trạng thái quan sát của currentItemReadyToPlay.

AVPlayerStatus status = [[change objectForKey:NSKeyValueChangeNewKey] integerValue]; 
    switch (status) { 
     case AVPlayerStatusUnknown: { 
      NSLog(@"PLAYER StatusUnknown"); 
     } 
      break; 
     case AVPlayerStatusReadyToPlay: { 
      NSLog(@"PLAYER ReadyToPlay"); 
      [self play]; 
     } 
      break; 
     case AVPlayerStatusFailed: { 
      AVPlayerItem *playerItem = (AVPlayerItem *)object; 
      [self handleError: [playerItem.error localizedDescription]]; 
     } 
      break; 
    } 

Tôi không biết điều này có gây phiền toái cho bạn hay không, tôi không thử điều này ở mức thấp hơn hoặc cao hơn 4,3,4 iPad, vì vậy tôi đoán tôi sẽ sớm gặp phải các biến chứng.

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