31

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

这在实际播放音频时效果很好,但如果由于网络速度变慢而导致流停止(即我收到AVPlayerItemPlaybackStalledNotification),则信息将从锁定屏幕中消失。但是,如果流继续播放,它会重新出现。

这很令人困惑,因为当正在播放的信息从锁定屏幕上消失时,它看起来像是应用程序已停止播放。但随后它恢复播放,当锁定屏幕 UI 似乎表明这不会发生时。

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

如果更多细节会有所帮助:

  • 当应用程序收到该通知时,它唯一要做的就是更新 UI。
  • 当有当前节目时,该应用程序永远不会清除MPNowPlayingInfoCenter,因此只要应该播放流,就会显示非空数据。
4

2 回答 2

1

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

于 2015-06-02T07:29:35.403 回答
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;
    }

}
于 2015-06-03T06:01:23.913 回答