首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在后台iOS5中播放多个音轨的AVQueuePlayer

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

Stack Overflow用户
提问于 2011-11-20 20:28:39
回答 1查看 2.3K关注 0票数 1

我使用AVQueuePlayer在后台播放了几个项目。并且代码在iOS4中工作得很好。而在iOS5中,AVQueuePlayer改变了它的行为,所以播放器在第一个项目结束后停止播放。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-22 01:28:37

Matt Gallagher在他的blog中回答道:“你必须观察AVQueuePlayer中的当前项目。当它发生变化时,你必须使用UIApplication来启动一个backgroundTask,并且只有当你收到下一个文件的准备播放通知时才结束后台任务。”

实际上,这对我没有帮助。

所以我的解决方案是:

代码语言:javascript
复制
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

我不能解释为什么,但是在添加新的AVPlayerItem之前放入的这行代码使我的代码正常工作。也适用于那些在后台添加下一首曲目并使用方法的人

代码语言:javascript
复制
- (void)loadValuesAsynchronouslyForKeys:(NSArray *)keys completionHandler:(void (^)(void))handler;

您必须将AVPlayerItem添加到主线程上的播放器中。如下所示:

代码语言:javascript
复制
- (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是对的,但它只有在不使用异步加载的情况下才有效。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8201471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档