iOS AVPlayer зависает при буферизации

Я пытаюсь транслировать mp3-файлы и пытаюсь буферизовать так же, как djromero говорит в this post в большинстве случаев он работает нормально, но случается, что он зависает после изменения статуса игрока на 1 случайным образом! Вот код:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if (kRateDidChangeKVO == context) {
    NSLog(@"Player playback rate changed: %.5f", self.player.rate);
    if (self.player.rate == 0.0) {
        if (self.player > 0) {
            NSLog(@" . . . PAUSE");
        }
    }

} else if (kStatusDidChangeKVO == context) {
    if(self.player.status == AVPlayerStatusFailed)
    {
        NSLog(@"failed");
        NSLog(@"error:%@",self.player.error);
    }

    NSLog(@"Player status changed: %li", (long)self.player.status);
    if (self.player.status == AVPlayerStatusReadyToPlay) {
        NSLog(@" . . . ready to play");
    }
} else if (kTimeRangesKVO == context) {
    NSLog(@"Loaded time ranges changed");
    NSArray *timeRanges = (NSArray *)[change objectForKey:NSKeyValueChangeNewKey];
    @try {
        if(timeRanges != (id)[NSNull null])
        if (timeRanges && [timeRanges count]) {
            CMTimeRange timerange = [[timeRanges objectAtIndex:0] CMTimeRangeValue];
            NSLog(@" . . . %.5f -> %.5f", CMTimeGetSeconds(timerange.start), CMTimeGetSeconds(CMTimeAdd(timerange.start, timerange.duration)));
            //first time play
            if (CMTIME_COMPARE_INLINE(timerange.duration, >, CMTimeMakeWithSeconds(10, timerange.duration.timescale))) {
                if (!self.mediaModel.playingStatus) {
                    [self.player play];
                    self.mediaModel.isPlaying = YES;
                    self.mediaModel.playingStatus = 1;
                }
            }
            //buffering paused
            if (CMTIME_COMPARE_INLINE(timerange.duration, >, CMTimeMakeWithSeconds(15, timerange.duration.timescale))) {
                if (self.mediaModel.playingStatus == 1) {
                    [self.player pause];
                    self.mediaModel.isPlaying = NO;
                    [[NSNotificationCenter defaultCenter] postNotificationName:MYAPPS_NOTIFICATION_MEDIA_BUFFERING object:nil];
                    self.mediaModel.playingStatus = 2;
                }
            }
            //play after buffer pause
            if (CMTIME_COMPARE_INLINE(timerange.duration, >=, CMTimeMakeWithSeconds(20, timerange.duration.timescale))) {
                if (self.mediaModel.playingStatus == 2) {
                    [self.player play];
                    [[NSNotificationCenter defaultCenter] postNotificationName:MYAPPS_NOTIFICATION_MEDIA_PLAYING object:nil];
                    self.mediaModel.playingStatus = 3;
                    self.mediaModel.isPlaying = YES;
                }
            }
            //button press paused
            if (CMTIME_COMPARE_INLINE(timerange.duration, >, CMTimeMakeWithSeconds(25, timerange.duration.timescale))) {
                if (self.mediaModel.playingStatus == 4) {
                    [self.player pause];
                    self.mediaModel.isPlaying = NO;
                    self.mediaModel.playingStatus = 5;
                }
            }
        }
    }
    @catch (NSException *exception) {
        NSLog(@"player exception: %@", exception);
        UIAlertView *alertview = [[UIAlertView alloc]initWithTitle:nil message:NSLocalizedString(@"An error happened! please try again later", @"Error!TryAgainLater") delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
        [alertview show];
        //[self killObservers];
    }
    @finally {
    }
}

}

и вот что я получаю из журнала:

Player status changed: 1
. . . ready to play
Player playback rate changed: 0.00000
. . . PAUSE

здесь можно застрять навсегда! не могли бы вы помочь мне с этим?


person user2804030    schedule 05.05.2015    source источник