2014-01-08 25 views
0

无法让AVQueuePlayer在应用程序进入后台后开始播放声音队列。从后台启动AVQueuePlayer

最基本的问题是:如何从背景中新创建的AVQueuePlayer实例启动声音?

这是类似于navi的应用程序,需要在时间到来时播放几个合适的声音和适当的方向。和大多数的应用程序在后台工作的时间...

详情如下...

它发挥得很好,当我从活动的应用程序启动和完成播放声音后也应用去背景。

我做了什么至今:

AppDelegatedidFinishLaunchingWithOptions我说:

NSError *sessionError = nil; 
    [[AVAudioSession sharedInstance] setDelegate:self]; 
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&sessionError]; 

    // Change the default output audio route 
    UInt32 doChangeDefaultRoute = 1; 
    AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, 
          sizeof(doChangeDefaultRoute), &doChangeDefaultRoute); 

应用程序启动后,我点击主页按钮,该应用程序进入后台。

当时间来到这个代码执行(应用程序仍然在后台,但请注意,我已经启用音频和AirPlay背景模式):

-(void)playTrainingFinishedSound 
{ 
    NSMutableArray *queue = [NSMutableArray array]; 
    [queue addObject:[AVPlayerItem playerItemWithURL:[[NSBundle mainBundle] URLForResource:@"alertkoniectreningu" withExtension:@"m4a"]]]; 
    [self initializeAudioPlayerWithQueue:queue]; 
    [self.appDelegate.audioPlayer play]; 
} 

-(void)initializeAudioPlayerWithQueue:(NSArray *)queue 
{ 
    self.appDelegate.audioPlayer = [[AVQueuePlayer alloc] initWithItems:queue]; 
    self.appDelegate.audioPlayer.actionAtItemEnd = AVPlayerActionAtItemEndAdvance; 
} 

不幸的是这个代码不作任何声音,与应用程序在前台的情况相反。

回答

0

哦,上帝,只是有一条线在AppDelegate中didFinishLaunchingWithOptions[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

,所以它看起来像现在丢失:

audioSession = [AVAudioSession sharedInstance]; 
    [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil]; 
    if (audioSession) [audioSession setActive:YES error:nil]; 
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

    // Change the default output audio route 
    UInt32 doChangeDefaultRoute = 1; 
    AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, 
          sizeof(doChangeDefaultRoute), &doChangeDefaultRoute); 
0

的AVPlayer失败的原因是因为你不能创建/初始化一个音频单元,而一个应用程序在后台,这是AVPlayer试图在底层做的事情。这个规则的例外当然是音频播放应用程序,当它们在后台时,可以通过操作系统内置的“播放”按钮来启动/恢复。因此,订阅远程控制事件的应用程序具有在后台启动音频单元的能力,这就是订阅这些事件似乎可以解决问题的原因。

目前还不清楚Apple是否可以通过这种方式使用API​​功能。

相关问题