AVQueuePlayer在后台iOS5中播放多个音轨

时间:2011-11-20 12:28:39

标签: objective-c ios5 avfoundation avplayer avqueueplayer

我使用AVQueuePlayer在后台播放多个项目。代码在iOS4中运行完美。在iOS5中,AVQueuePlayer改变了它的行为,因此播放器在第一个项目结束后停止播放。

Matt Gallagher在此post中写了一个提示。 “从iOS 5开始,似乎AVQueuePlayer不再预先缓冲。它确实预缓冲了iOS 4中的下一首曲目。”

所以我的问题是如何在iOS5中使用AVPlayer或AVQueuePlayer在后台播放几个项目。

1 个答案:

答案 0 :(得分:1)

Matt Gallagher在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;
    }

}];

更新: Matt Gallagher是对的,但只有当你不使用异步加载时它才有效。