2011-09-14 40 views
15

iOS 4.3.3 ve sonrasında bunun üzerinde çalışmıyor.AVPlayer replaceCurrentItemWithPlayerItem Ben AVPlayer kullanarak inşa ediyorum bir ses çalar var

Şu anda, etrafında player örneğini tutmak ve ben (manuel seçimden veya parça sonuna ulaştı ya) parçaları takas gerektiğinde yeni bir AVPlayerItem oluşturmak ve yeni öğe ile replaceCurrentItemWithPlayerItem diyoruz.

Dokümanlara göre, replaceCurrentItemWithPlayerItem senkronize olmayan bir işlemdir, bu nedenle oynatıcının currentItem anahtar yolunu da gözlemliyorum. Bu çağrıldığında, oyuncuma oynamasını söylerim. İşte

ilgili kodudur:

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

Ve burada anahtar değeri gözlem geri arama geçerli:

benim anahtar gözlem yöntemi denir iOS 4.3.3 (ve iOS 5) Açık
- (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]; 
    } 
} 

ama _player.currentItem her zaman nil'dir. 4.2.1 ve 4.3.2'de, bu özellik gerçek değeri içerir. Bu yöntem bir daha asla çağrılmaz. Yani özünde, yerine koyma her zaman başarısız gibi görünüyor.

Bu bir böcek gibi görünüyor, ama belki de yanlış bir şey yapıyorum.

+0

Dunja aşağıda cevap sorununuzu çözdü mü? –

cevap

17

Bu sorunu iOS 5 (5.0.1 dahil) ile yaşadım. IOS 4.x'te iyi çalışıyordu.

Bu geçici çözümün iki yolu vardır, parçaları değiştirmek istediğiniz her zaman AVPlayer ürününü istediğiniz AVPlayerItem s ile serbest bırakın ve yeniden oluşturun. Veya ana iş parçacığına yalnızca replaceCurrentItemWithPlayerItem: numaralı telefonu arayın.

Her iki seçeneği de denedim ve iyi çalıştılar.

Kredi için: Apple Developer Forums

+0

Ana iş parçacığı üzerinde çalışan hata, benim için düzeltildi. – vaughan

1

Benzer sorunlarla karşılaşıyorum. Muhtemelen benim gibi AVPlayerDemoPlaybackViewController from Apple sample code'dan başladım. henüz yüklenen veya oynatma için hazır değil çünkü Belki currentItemnil neden sorunudur (benim sorunum ben yeni AVPlayerItem süresini alamadım idi).

currentItem'un gözlenen durumu ReadyToPlay olduğunda oynatmayı başlatmayı deneyebilirsiniz. bu sizin için wok eğer bilmiyorum

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

, ben düşük veya 4.3.4 iPad daha yüksek bu deneyin vermedi, bu yüzden yakında komplikasyonlar içine edeceğiz sanırım.

İlgili konular