MPNowPlayingInfoCenter在音频流停止时消失

时间:2015-04-21 00:00:54

标签: ios audio avfoundation avplayer mpnowplayinginfocenter

我的应用通过AVPlayer播放流媒体音频,并使用MPNowPlayingInfoCenter在设备锁定屏幕上显示有关该流的信息。

这在音频实际播放时工作正常,但如果流因网络速度减慢而停止(即我收到AVPlayerItemPlaybackStalledNotification),则信息会从锁定屏幕消失。但是如果流恢复播放,它会重新出现。

这很令人困惑,因为当现在播放的信息从锁定屏幕消失时,它会给出应用已停止播放的外观。但是当锁定屏幕UI似乎表明这不会发生时,它会恢复播放。

我能做些什么来确保现在播放的信息在流播放时仍然可见,但目前不是由于网络速度问题?似乎保持一致的锁屏UI的唯一方法是在网络连接停止时实际终止它,这有点愚蠢,但至少不会混淆。

如果有更多细节可以提供帮助:

  • 当应用获得该通知时,它唯一做的就是更新用户界面。
  • 当有当前程序时,应用程序永远不会清除MPNowPlayingInfoCenter,因此只要该流应该正在播放,就会显示非空数据。

2 个答案:

答案 0 :(得分:1)

如果我要猜测(自从我使用AVFoundation已经有一段时间了),我会假设一旦数据停止流过音频缓冲区,操作系统就会停用音频会话。一个技巧是保持第二个AVPlayer播放静音以填补死点,直到你已经缓冲了足够的数据来恢复播放或达到一些超时并且放弃。使用通知在播放器对象之间切换。

答案 1 :(得分:1)

即使在网络问题中设置锁定屏幕,我也没有遇到任何问题。

我也在处理流媒体。

我认为锁定屏幕仅在音频会话处于活动状态时受到影响。

在这里,您可以看到我的代码,我没有遇到任何问题,希望这会对您有所帮助。

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

}