首页 文章

从后台启动AVQueuePlayer

提问于
浏览
1

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

基本问题是: how to start sound from newly created AVQueuePlayer instance from background?

对于类似导航的应用程序,需要在时机成熟时播放具有适当方向的组合声音 . 大多数时候应用程序在后台工作......

详情如下......

当我从活动应用程序启动它时播放就好了,即使在应用程序转到后台后也能完成播放声音 .

What I did so far:

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

应用程序启动后,我单击主页按钮,以便应用程序进入后台 .

当时间到了,这个代码执行了(应用程序仍在后台,但请注意,我已启用 Audio and AirPlay background mode ):

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

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

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);
    
  • 0

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

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

相关问题