我使用 AVQueuePlayer 在后台播放多个项目。并且代码在 iOS4 中运行完美。并且在 iOS5 中 AVQueuePlayer 改变了它的行为,所以播放器在第一个项目结束后停止播放。
Matt Gallagher 在这篇文章中写了一个提示。“从 iOS 5 开始,AVQueuePlayer 似乎不再预缓冲。它确实预缓冲了 iOS 4 中的下一个曲目。”
所以我的问题是如何在 iOS5 中使用 AVPlayer 或 AVQueuePlayer 在后台播放多个项目。
我使用 AVQueuePlayer 在后台播放多个项目。并且代码在 iOS4 中运行完美。并且在 iOS5 中 AVQueuePlayer 改变了它的行为,所以播放器在第一个项目结束后停止播放。
Matt Gallagher 在这篇文章中写了一个提示。“从 iOS 5 开始,AVQueuePlayer 似乎不再预缓冲。它确实预缓冲了 iOS 4 中的下一个曲目。”
所以我的问题是如何在 iOS5 中使用 AVPlayer 或 AVQueuePlayer 在后台播放多个项目。
Matt Gallagher 在他的博客中回答:“您必须观察 AVQueuePlayer 中的当前项。当它发生变化时,您必须使用 UIApplication 启动一个 backgroundTask,并且只有在收到下一个文件的准备播放通知时才结束后台任务。”
实际上,这对我没有帮助。
所以我的解决方案是:
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
我无法解释为什么,但是在添加新的 AVPlayerItem 之前放置的这行代码使我的代码工作。也适用于那些在后台添加下一首曲目并使用方法的人
- (void)loadValuesAsynchronouslyForKeys:(NSArray *)keys completionHandler:(void (^)(void))handler;
您必须在主线程上将 AVPlayerItem 添加到播放器。像这样:
- (void)addAsset:(AVAsset*)as
{
[player insertItem:[AVPlayerItem playerItemWithAsset:as] afterItem:[player currentItem]];
}
.........
//adding new track
AVURLAsset* as = [[self createAsset:urlString] retain];
NSArray *keys = [NSArray arrayWithObject:@"tracks"];
[as loadValuesAsynchronouslyForKeys:keys completionHandler:^(void) {
NSError *error =
AVKeyValueStatus trackStatus = [as statusOfValueForKey:@"tracks" error:&error];
switch (trackStatus) {
case AVKeyValueStatusLoaded:
[self performSelectorOnMainThread:@selector(addAsset:) withObject:as waitUntilDone:YES];
[as release];
break;
case AVKeyValueStatusFailed:
[as release];
break;
case AVKeyValueStatusCancelled:
[as release];
break;
default:
break;
}
}];
更新:Matt Gallagher 是对的,但它仅在您不使用异步加载时才有效。