Перезапуск потери соединения AVPlayer

Я использую объект AVPlayer для воспроизведения удаленного радиопотока в своем приложении для iOS. Поток работает нормально и играет в фоновом режиме.

Выполняя некоторые тесты подключения, я столкнулся с некоторыми проблемами. Как только соединение с проигрывателем потеряно, проигрыватель останавливается (как и следовало ожидать), однако я не могу заставить проигрыватель начать снова, когда соединение вернется.

Я грубо настроил таймер так, чтобы каждую секунду нажимать [Player Play], чтобы принудительно запустить его, но не повезло. Мое лучшее предположение основано на отсутствии запрашиваемых данных, которые он только что умер.

У меня есть настройка наблюдателя, чтобы отслеживать, когда проигрыватель готов к запуску или если есть ошибка, но, похоже, это вообще не вызывается после начального времени.

Мой вопрос заключается в том, как заставить AVPlayer снова начать получать поток, когда он будет доступен.

Я создал аудиоплеер подклассом BCRadio

-(BCRadio*)initWithRadioOneAndAutoPlay:(BOOL)autoPlay whenReady:(void(^)(void))ready whenFailed:(void(^)(void))failed whenBecameActive:(void(^)(void))active {

    // Current item
    self.playerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:@"http://69.64.92.79:8276"]];

    // Super it
    self = [super initWithPlayerItem:self.playerItem];

    // Observe for it become ready
    [self addObserver:self forKeyPath:@"status" options:0 context:nil];

    // If app comes from background and if app goes inactive
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appBecameActive) name:UIApplicationDidBecomeActiveNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appEnteredBackground) name:UIApplicationDidEnterBackgroundNotification object:nil];

    // Set blocks
    self.playerReady = ready;
    self.playerFailed = failed;
    self.playerActive = active;
    self.willAutoPlay = autoPlay;

    // Register for remote notifications
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

    // Play is pressed
    [[NSNotificationCenter defaultCenter] addObserverForName:@"TogglePlay" object:nil queue:NULL usingBlock:^(NSNotification *notification){
        [self doPlay:YES];
    }];

    // Pause is pressed
    [[NSNotificationCenter defaultCenter] addObserverForName:@"TogglePause" object:nil queue:NULL usingBlock:^(NSNotification *notification){
        [self doPlay:NO];
    }];


    // Check if playing
    NSTimer *timer = [NSTimer bk_scheduledTimerWithTimeInterval:1 block:^(NSTimer *timer){
        [self statusMonitor];
    } repeats:YES];
    [timer fire];

    // Monitor reachability and pause when needed
    Reachability* reach = [Reachability reachabilityWithHostname:@"69.64.92.79"];
    reach.reachableBlock = ^(Reachability*reach){
        if(self.willAutoPlayOnResume && !self.playing){
            self.willAutoPlayOnResume = NO;
            [self doPlay:YES];
        }
    };
    reach.unreachableBlock = ^(Reachability*reach){
        if(self.playing){
            self.willAutoPlayOnResume = YES;
            [self doPlay:NO];
        }
    };
    [reach startNotifier];

    return self;

}

person slaterjohn    schedule 18.12.2014    source источник
comment
у нас такая же проблема. Похоже на ошибку в AVPlayer, согласно stackoverflow.com/questions/28059019/   -  person Andy    schedule 10.06.2015