Подтвердить что ты не робот

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

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

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

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

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

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

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

Ответ 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;
    }

}