【问题标题】:MPNowPlayingInfoCenter Disappears when audio stream stallsMPNowPlayingInfoCenter 在音频流停止时消失
【发布时间】:2015-06-27 22:11:41
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 您是从时间观察者那里设置信息中心字典吗?例如:addPeriodicTimeObserverForInterval:
  • 不,我没有使用时间观察器。正在播放的信息仅在直接响应用户操作和应用进入前台时更新。
  • 您在收听AVPlayerItemPlaybackStalledNotification 吗?当你不听的时候会发生什么?缓存数据流又是什么?
  • 谁拥有字典,是强属性还是局部变量?
  • @MiralemCebic 是的,我正在收听该通知。如果我不听,则无法更新 UI,因此即使没有声音,它看起来仍在播放。收到通知后,我不会更改正在播放的信息。

标签: ios audio avfoundation avplayer 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;
        }
    
    }
    

    【讨论】:

    • 发生卡顿时是否调用该方法?
    • 我只是在我的音频在那里时调用这个方法,我的意思是假设用户点击播放和音频流在那里然后我调用这个方法。
    • 在这种情况下,它与我已经在做的没有什么不同。我激活音频会话,使用相同的音频类别,并将信息传递给MPNowPlayingInfoCenter。你收到AVPlayerItemPlaybackStalledNotification了吗?
    • 也许你是对的,但我没有使用 AVPlayerItemPlaybackStalledNotification
    • 那么你没有遇到我在问题中描述的情况。
    猜你喜欢
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    相关资源
    最近更新 更多