MPNowPlayingInfoCenter Исчезает, когда поток аудиопотоков
Мое приложение воспроизводит потоковое аудио через AVPlayer
и использует MPNowPlayingInfoCenter
для отображения информации о потоке на экране блокировки устройства.
Это отлично работает, когда звук фактически воспроизводится, но если поток ложится из-за замедления сети (т.е. я получаю AVPlayerItemPlaybackStalledNotification
), информация исчезает с экрана блокировки. Но если поток возобновит игру, он снова появится.
Это сбивает с толку, потому что когда исчезающая информация исчезает с экрана блокировки, она дает вид, что приложение остановило воспроизведение. Но затем он возобновляет воспроизведение, когда пользовательский интерфейс блокировки экрана указывает, что этого не произойдет.
Есть ли что-то, что я могу сделать, чтобы убедиться, что информация, воспроизводимая сейчас, остается видимой, когда поток должен воспроизводиться, но в настоящее время не из-за проблем со скоростью сети? Кажется, единственный способ сохранить постоянный пользовательский интерфейс блокировки экрана - фактически убить сетевое соединение, когда оно заглохнет, что является довольно глупым, но, по крайней мере, не путать.
В случае, если более подробная информация поможет:
- Когда приложение получает это уведомление, единственное, что он делает, это обновление пользовательского интерфейса.
- Приложение никогда не очищает
MPNowPlayingInfoCenter
, когда есть текущая программа, поэтому пока предполагается, что поток должен воспроизводиться, есть непустые данные, которые должны отображаться.
Ответы
Ответ 1
Если я должен был угадать (и прошло некоторое время с тех пор, как я использовал AVFoundation), я бы предположил, что ваш аудио-сеанс дезактивируется ОС, как только данные перестанут проходить через звуковой буфер. Один трюк состоял бы в том, чтобы поддерживать второй AVPlayer, который воспроизводит тишину, чтобы заполнить мертвые точки, пока вы не буферизировали достаточное количество данных, чтобы возобновить воспроизведение или достигнуть некоторого таймаута и просто отказаться. Используйте уведомление для переключения между объектами проигрывателя.
Ответ 2
У меня нет проблем при установке экрана блокировки даже в сетевой проблеме.
Я также занимаюсь потоковой передачей.
И я думаю, что экран блокировки влияет только на активный сеанс аудио.
Здесь вы можете увидеть мой код, и я не получаю никакой проблемы, надеюсь, это поможет вам.
-(void)setLockScreen
{
Class playingInfoCenter = NSClassFromString(@"MPNowPlayingInfoCenter");
if (playingInfoCenter)
{
[[AVAudioSession sharedInstance] setActive:YES error:nil];
NSError *myErr;
if (![[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&myErr])
{
// Handle the error here.
NSLog(@"Audio Session error %@, %@", myErr, [myErr userInfo]);
}
else
{
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];
}
MPMediaItemArtwork *albumArt = [[MPMediaItemArtwork alloc] initWithImage:imgViewLogo.image];
NSArray *keys = [NSArray arrayWithObjects:
MPMediaItemPropertyTitle,
MPMediaItemPropertyArtist,
MPMediaItemPropertyArtwork,
MPNowPlayingInfoPropertyPlaybackRate,
nil];
NSArray *values = [NSArray arrayWithObjects:
[[self.arrChannel objectAtIndex:[AppDelegate sharedAppDelegate].selectedRow] objectForKey:@"name"],
[[AppDelegate sharedAppDelegate].dictChannelsConfig objectForKey:@"venueName"],
albumArt,
[NSNumber numberWithInt:1],
nil];
NSDictionary *mediaInfo = [NSDictionary dictionaryWithObjects:values forKeys:keys];
keys = nil;
values = nil;
albumArt = nil;
[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:mediaInfo];
mediaInfo = nil;
}
}