2016-04-14 71 views
4

Sonra .pause() işlevi çağırırsam .play() tamam, devam ediyor ancak .pause() öğesinden 30-60 saniye sonra beklerim.Duraklatıldıktan sonra AVPlayer devam edemiyor + biraz beklemede

  • AVPlayerStatus.Failed yanlış

  • AVPlayerStatus.ReadyToPlay Ben çalışması için url ile oyuncu yeniden başlatmak gerektiğini

true döndürür döndürür oynamak için başarısız. Şimdi bunu yapmak istiyorum, eğer oyuncu oynatabiliyorsa, sadece .play() işlevini çağırmak istiyorum ama eğer değilse, onu yeniden başlatmak istiyorum, sorum, oyuncunun oynanabilir olup olmadığını nasıl algılayabileceğimizdir? Bu arada, .pls uzantısı

+0

Durum kontrollerinin 60 saniye gecikmesinden sonra yapıldığını düşünüyorum, değil mi? – sailens

+0

evet tam olarak ikisi de 60 saniye beklemeden sonra kontrol yap – turushan

+0

Bunun neden olduğu hakkında hiçbir fikrim yok: S – sailens

cevap

1

ile bir radyo bağlantısı olması Gerçekten de, uzun bir süre sonra tekrar başladığında oyuncunun limbo olduğunu gösteren bir işaret yoktur. (Benim testlerimde, bu durumda AVPlayerItem'den alınan metanun null olduğunu gördüm)

Neyse .. Duraklattığınız zaman, internetten aldığımdan (bu konuda uygun bir belge yok), Oyuncu arka planda tamponlamaya devam eder ve eğer 50-60 saniyeden sonra devam ederseniz sadece yapamazsınız. Bir durdurma işlevi burada iyi olurdu.

Benim çözümüm: 50 saniye geçip geçmediğini kontrol etmek için basit bir zamanlayıcı ve eğer devam ederse, özgeçmiş yöntemi çağrıldığında bir bayrağı güncellemek istiyorum Yeni bir oyuncu başlatmak istiyorum.

func pausePlayer() { 
    .. 
    player.pause() 
    .. 

    // Will count to default 50 seconds or the indicated interval and only then set the bufferedInExcess flag to true 
    startCountingPlayerBufferingSeconds() 
    bufferedInExcess = false 
} 


func startCountingPlayerBufferingSeconds(interval: Double = 50) { 
    timer = NSTimer.scheduledTimerWithTimeInterval(interval, target: self, selector: Selector("setExcessiveBufferedFlag"), userInfo: nil, repeats: false) 
} 

func setExcessiveBufferedFlag() { 
    if DEBUG_LOG { 
     print("Maximum player buffering interval reached.") 
    } 
    bufferedInExcess = true 
} 

func stopCountingPlayerBufferingSeconds() { 
    timer.invalidate() 
} 

func resumePlayer() { 
    if haveConnectivity() { 
     if (.. || bufferedInExcess) { 
      startPlaying(true) 
     } else { 
      .. 
      player.play 
     } 
     .. 
    } 
} 

func startPlaying(withNewPlayer: Bool = false) { 
    if (withNewPlayer) { 
     if DEBUG_LOG { 
      print("Starting to play on a fresh new player") 
     } 

     // If we need another player is very important to fist remove any observers for 
     // the current AVPlayer/AVPlayerItem before reinitializing them and add again the needed observers 
     initPlayer() 

     player.play() 
     ... 
    } 
    ... 
} 
0

Çözümümü hedefime yüklüyorum c. Bu nedenle, duraklatma düğmesine basarken bir zamanlayıcı ekledim ve bu zamanlayıcı 85 saniyeden sonra patlarsa (bu saniye ara belleğe alma durduktan sonra), YES'e bir boole ayarlıyorum ve ses yeniden başladığında bu boolean YES ise yeni bir oyuncu oluyorum.

-(void)play{ 
if (self.player){ 

    if (self.bufferingExpired){ 
     self.bufferingExpired = NO; 
     [self initializePlayerWithStation:self.currentStation]; 
    }else{ 
     [self.player play]; 
    } 

    [self.resumeTimer invalidate]; 
    self.resumeTimer = nil; 
    } 

} 

-(void)pause{ 

    if (self.player){ 
     [self.player pause]; 
     [[NSNotificationCenter defaultCenter]postNotificationName:kNotificationAudioPaused object:nil]; 
     self.resumeTimer = [NSTimer scheduledTimerWithTimeInterval:kResumeStreamingTimer target:self selector:@selector(addNewPlayerItemWhenResuming) userInfo:nil repeats:NO]; 
    } 

} 

-(void)addNewPlayerItemWhenResuming{ 
    self.bufferingExpired = YES; 
} 

-(void)initializePlayerWithStation:(RadioStation*)station{ 
    _currentStation = station; 
    _stream_url = station.url; 

    AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:_stream_url]; 

    if (self.player != nil){ 
     [[self.player currentItem] removeObserver:self forKeyPath:@"status"]; 

    } 

    [item addObserver:self forKeyPath:@"status" options:0 context:nil]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(playerItemFailedToPlayToEndTime:) 
              name:AVPlayerItemDidPlayToEndTimeNotification 
              object:item]; 

    self.player = [AVPlayer playerWithPlayerItem:item]; 

}