1

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

基本问题是:如何AVQueuePlayer从后台新创建的实例开始声音?

它适用于类似导航的应用程序,需要在时机成熟时播放具有适当方向的组合声音。而且大多数时候该应用程序在后台运行......

详情如下...

当我从活动应用程序启动它时它播放得很好,即使在应用程序进入后台后也完成播放声音。

到目前为止我做了什么:

AppDelegate里面didFinishLaunchingWithOptions我补充说:

    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;
}

不幸的是,这段代码没有发出任何声音,这与应用程序处于前台时的情况相反。

4

2 回答 2

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);  
于 2014-01-08T12:55:50.693 回答
0

AVPlayer 失败的原因是您无法在应用程序处于后台时创建/初始化音频单元,而这正是 AVPlayer 试图在后台执行的操作。此规则的例外当然是音频播放应用程序,当它们在后台时,可以通过操作系统内置的“播放”按钮启动/恢复。因此,订阅远程控制事件的应用程序能够在后台启动音频单元,这就是订阅这些事件似乎可以解决问题的原因。

目前尚不清楚 Apple 是否同意以这种方式使用 API 功能。

于 2014-01-08T22:00:04.100 回答