我使用AVQueuePlayer在后台播放多个项目。代码在iOS4中完美运行。在iOS5中,AVQueuePlayer改变了它的行为,所以玩家在第一项结束后停止播放。AVQueuePlayer在后台播放多个音轨iOS5
马特加拉格尔在这post写了一个提示。 “从iOS 5开始,看起来AVQueuePlayer不再预先缓存,它预先缓存了iOS 4中的下一首曲目。”
所以我的问题是如何在iOS5中使用AVPlayer或AVQueuePlayer在后台播放多个项目。
我使用AVQueuePlayer在后台播放多个项目。代码在iOS4中完美运行。在iOS5中,AVQueuePlayer改变了它的行为,所以玩家在第一项结束后停止播放。AVQueuePlayer在后台播放多个音轨iOS5
马特加拉格尔在这post写了一个提示。 “从iOS 5开始,看起来AVQueuePlayer不再预先缓存,它预先缓存了iOS 4中的下一首曲目。”
所以我的问题是如何在iOS5中使用AVPlayer或AVQueuePlayer在后台播放多个项目。
马特·加拉格尔在他blog回答: “你必须在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;
}
}];
UPDATE: 马特·加拉格尔是正确的,但它只能如果你不使用异步加载。