MPNowPlayingInfoCenter исчезает, когда аудиопоток останавливается

Мое приложение воспроизводит потоковое аудио через AVPlayer и использует MPNowPlayingInfoCenter для отображения информации о потоке на экране блокировки устройства.

Это отлично работает, когда звук действительно воспроизводится, но если поток останавливается из-за замедления сети (т.е. я получаю AVPlayerItemPlaybackStalledNotification), информация исчезает с экрана блокировки. Но затем, если поток возобновляет воспроизведение, он снова появляется.

Это сбивает с толку, потому что когда воспроизводимая информация исчезает с экрана блокировки, создается впечатление, что приложение остановило воспроизведение. Но затем он возобновляет воспроизведение, когда пользовательский интерфейс экрана блокировки, кажется, указывает, что этого не произойдет.

Есть ли что-то, что я могу сделать, чтобы убедиться, что информация о текущем воспроизведении остается видимой всякий раз, когда поток должен воспроизводиться, но в настоящее время это не связано с проблемами скорости сети? Кажется, что единственный способ сохранить согласованный пользовательский интерфейс экрана блокировки — это фактически отключить сетевое соединение, когда оно зависает, что довольно глупо, но, по крайней мере, не сбивает с толку.

В случае, если более подробная информация поможет:

  • Когда приложение получает это уведомление, единственное, что оно делает, — это обновляет пользовательский интерфейс.
  • Приложение никогда не очищает MPNowPlayingInfoCenter, когда есть текущая программа, поэтому, пока поток должен воспроизводиться, должны отображаться непустые данные.

person Tom Harrington    schedule 21.04.2015    source источник
comment
Вы устанавливаете словарь инфоцентра из обозревателя времени? Например: addPeriodicTimeObserverForInterval:   -  person yairsz    schedule 06.05.2015
comment
Нет, я не использую наблюдатель времени. Воспроизводимая информация обновляется только в ответ на действия пользователя и когда приложение выходит на передний план.   -  person Tom Harrington    schedule 06.05.2015
comment
Вы слушаете AVPlayerItemPlaybackStalledNotification ? Что происходит, когда вы не слушаете? А как насчет кэширования ваших потоков данных?   -  person Miralem Cebic    schedule 06.05.2015
comment
Кому принадлежит словарь, это сильное свойство или локальная переменная?   -  person yairsz    schedule 06.05.2015
comment
@MiralemCebic Да, я слушаю это уведомление. Если я не слушаю его, я не могу обновить пользовательский интерфейс, поэтому похоже, что он все еще воспроизводится, хотя звука нет. Я не меняю информацию о текущем воспроизведении, когда это уведомление получено.   -  person Tom Harrington    schedule 06.05.2015
comment
@yairsz Словарь является локальным, но поскольку MPNowPlayingInfoCenter объявляет nowPlayingInfo copy иваром, это не имеет значения. Несмотря на это, он работает нормально, за исключением случаев, когда происходит задержка звука.   -  person Tom Harrington    schedule 06.05.2015


Ответы (2)


Если бы я сделал предположение (а я уже давно не использовал AVFoundation), я бы предположил, что ваш аудиосеанс деактивируется ОС, как только данные перестают проходить через аудиобуфер. Один из трюков заключается в том, чтобы поддерживать второй AVPlayer, который воспроизводит тишину, чтобы заполнить мертвые зоны, пока вы не накопите достаточно данных для возобновления воспроизведения или не достигнете некоторого тайм-аута и просто не сдадитесь. Используйте уведомление для переключения между объектами игрока.

person Marco Monteiro    schedule 02.06.2015

У меня не возникает никаких проблем при установке экрана блокировки даже при проблемах с сетью.

Я также занимаюсь потоковой передачей.

И я думаю, что экран блокировки влияет только на то, активен ли аудиосеанс или нет.

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

-(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;
    }

}
person Bhavesh Lathigara    schedule 03.06.2015
comment
Вызываете ли вы этот метод, когда происходит зависание? - person Tom Harrington; 03.06.2015
comment
Я просто вызываю этот метод, когда есть мой звук, я имею в виду, что пользователь Hit играет и потоковая передача звука есть, тогда я вызываю этот метод. - person Bhavesh Lathigara; 04.06.2015
comment
В этом случае это ничем не отличается от того, что я уже делаю. Я активирую аудиосессию, использую ту же категорию аудио и передаю информацию MPNowPlayingInfoCenter. Вы получаете AVPlayerItemPlaybackStalledNotification? - person Tom Harrington; 04.06.2015
comment
Возможно, вы правы, но я не использую AVPlayerItemPlaybackStalledNotification - person Bhavesh Lathigara; 05.06.2015
comment
Тогда вы не испытываете ситуацию, которую я описал в вопросе. - person Tom Harrington; 05.06.2015