[英]AVPlayer not forwarding streaming track in background
我在AVPlayer不在后台播放时遇到问题。
详细信息如下:
我有一个AVPlayer对象和一个AVPlayerItem作为视图控制器的实例变量,以从存储在NSMutableArray, linkArray中的链接流式播放音乐。 当用户在UITableView中点击轨道时,两个对象都将被实例化,如下所示:
musicPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[linkArray objectAtIndex:indexPath.row]]];
player = [[AVPlayer alloc] initWithPlayerItem:musicPlayerItem];
...而且播放非常完美。 只要在应用程序处于活动状态时跟踪结束,就会跳过正常,或者当我手动触发应用程序以跳过跟踪时(无论它处于活动状态还是背景运行)。 但是,当应用程序在后台运行时(包括设备锁定时),跳过时不会播放下一首曲目。
因此,它会自动跳到下一首曲目,但不会播放。 我要么必须再次使该应用程序处于活动状态,要么调用播放(通过耳机控件或系统范围的音乐控件)。
这是skipTrack方法的代码,在手动调用时或在歌曲到达曲目结尾时由系统调用:
if (nowPlaying == [linkArray count]-1) {
nowPlaying = 0;
musicPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[linkArray objectAtIndex:0]]];
player = [[AVPlayer alloc] initWithPlayerItem:musicPlayerItem];
} else {
NSLog(@"NowPlaying (before increment: %i", nowPlaying);
//If not, increment nowPlaying by one and play
nowPlaying++;
NSLog(@"NowPlaying (after increment: %i", nowPlaying);
musicPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[linkArray objectAtIndex:nowPlaying]]];
player = [[AVPlayer alloc] initWithPlayerItem:musicPlayerItem];
}
真的希望有人可以帮助我
因此,问题在于,因为您已启用应用程序在后台播放音频,所以在播放音乐时它将保持活动状态。 音乐一停止,它就会暂停。 因此,您需要在歌曲停止播放后立即请求时间在后台执行任务(大多数播放器都具有回调功能,以便在歌曲播放完毕时将此代码放在开头)。 所以你的代码看起来像这样...
UIBackgroundTaskIdentifier newTaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
// Clean up any unfinished task business by marking where you.
// stopped or ending the task outright.
[application endBackgroundTask:newTaskID];
newTaskID = UIBackgroundTaskInvalid;
}];];
if (nowPlaying == [linkArray count]-1) {
nowPlaying = 0;
musicPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[linkArray objectAtIndex:0]]];
player = [[AVPlayer alloc] initWithPlayerItem:musicPlayerItem];
} else {
NSLog(@"NowPlaying (before increment: %i", nowPlaying);
//If not, increment nowPlaying by one and play
nowPlaying++;
NSLog(@"NowPlaying (after increment: %i", nowPlaying);
musicPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[linkArray objectAtIndex:nowPlaying]]];
player = [[AVPlayer alloc] initWithPlayerItem:musicPlayerItem];
}
[[UIApplication sharedApplication] endBackgroundTask:newTaskID];
newTaskID = UIBackgroundTaskInvalid;'
“ beginBackgroundTaskWithExpirationHandler:”方法将使您有一些时间在后台执行操作。 如果您的时间用完了,将执行发送到该方法的代码块。 您需要包括以防万一出问题了,并且需要清理任务。 在开发人员库中阅读更多有关它的信息: 这里
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.