2011-09-14 16 views
15

Mam odtwarzacz audio, który buduję za pomocą AVPlayera.AVPlayer replaceCurrentItemWithPlayerItem nie działa na iOS 4.3.3+

Obecnie trzymam instancję player wokół i kiedy muszę zamienić utworów (zarówno z ręcznym wyborem lub utwór dobiegł końca) tworzę nowy AVPlayerItem i wzywam replaceCurrentItemWithPlayerItem z nowej pozycji.

Zgodnie z dokumentacją, replaceCurrentItemWithPlayerItem jest operacją asynchroniczną, więc obserwuję również kluczową ścieżkę odtwarzacza currentItem. Kiedy zostanie to wywołane, mówię mojemu graczowi, żeby zagrał.

Oto odpowiedni kod:

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]; 
} 

I tu jest klucz zwrotna obserwacja wartość:

- (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]; 
    } 
} 

iOS 4.3.3 i iOS (5) mój klucz metoda nazywa ale obserwacja _player.currentItem jest zawsze nil. W 4.2.1 i 4.3.2 ta właściwość zawiera rzeczywistą wartość. Ta metoda nigdy nie jest wywoływana ponownie. Zasadniczo wymiana wydaje się zawsze zawieść.

To wygląda na błąd, ale być może robię coś nie tak.

+0

Czy odpowiedź poniżej Dunja rozwiązać swój problem? –

Odpowiedz

17

Miałem ten problem z iOS 5 (w tym 5.0.1). Wcześniej pracowało dobrze na iOS 4.x.

Istnieją dwa sposoby obejścia tego problemu, zwolnienia i odtworzenia swojego AVPlayer z żądanymi AVPlayerItem s za każdym razem, gdy trzeba zamienić utwory. Lub po prostu zadzwoń pod numer replaceCurrentItemWithPlayerItem: w głównym wątku.

Próbowałem obie opcje i działały dobrze.

kuponów do: Apple Developer Forums

+0

Uruchamianie głównego wątku naprawiło błąd dla mnie. – vaughan

1

Mam podobne problemy. Prawdopodobnie zacząłeś od AVPlayerDemoPlaybackViewController from Apple sample code, tak jak ja. Może problem z tym, że currentItem jest nil, ponieważ nie jest jeszcze załadowany lub gotowy do odtwarzania (mój problem polegał na tym, że nie mogłem uzyskać czasu trwania nowego AVPlayerItem).

Możesz spróbować uruchomić odtwarzanie, gdy obserwowany stan currentItem jest ReadyToPlay.

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; 
    } 

Nie wiem, czy to będzie wok dla ciebie, nie próbujcie tego na niższy lub wyższy niż 4.3.4 iPad, więc chyba będę napotkasz powikłań wkrótce.

Powiązane problemy