我的应用通过AVPlayer
播放流媒体音频,并使用MPNowPlayingInfoCenter
在设备锁定屏幕上显示有关该流的信息。
这在音频实际播放时工作正常,但如果流因网络速度减慢而停止(即我收到AVPlayerItemPlaybackStalledNotification
),则信息会从锁定屏幕消失。但是如果流恢复播放,它会重新出现。
这很令人困惑,因为当现在播放的信息从锁定屏幕消失时,它会给出应用已停止播放的外观。但是当锁定屏幕UI似乎表明这不会发生时,它会恢复播放。
我能做些什么来确保现在播放的信息在流播放时仍然可见,但目前不是由于网络速度问题?似乎保持一致的锁屏UI的唯一方法是在网络连接停止时实际终止它,这有点愚蠢,但至少不会混淆。
如果有更多细节可以提供帮助:
MPNowPlayingInfoCenter
,因此只要该流应该正在播放,就会显示非空数据。答案 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;
}
}