Я использую объект 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;
}