【问题标题】:Background Audio in iOSiOS 中的背景音频
【发布时间】:2012-09-27 10:25:59
【问题描述】:

我正在尝试构建一个 iOS 应用程序 (iOS > 5.0)。它应该在用户设置的计时器结束时播放音乐文件。这是我到目前为止的设置:

  • 我用的是avplayer
  • 我已将 plist 中的背景模式设置为“应用播放音频”
  • 在我的 appDelegate 中有:

    NSError *sessionError = nil;
    [[AVAudioSession sharedInstance] setDelegate:self];
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&sessionError];
    
  • 在一首歌曲将要播放之前:

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&sessionError];
    [[AVAudioSession sharedInstance] setActive:YES error:&sessionError];
    
  • 我在“playerItemDidPlayToEnd”上通知我的应用程序,停止播放器并告诉其他应用程序(如 music.app)再次激活

    _avPlayer = nil;
    NSError *sessionError = nil;
    [[AVAudioSession sharedInstance] setActive:NO withFlags:AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation error:&sessionError];
    

这很好用。您可以让您的音乐应用在后台播放。我的应用程序开始播放音乐应用程序逐渐消失的歌曲。我的歌曲已播放,如果完成,音乐应用程序将继续播放。但前提是我的应用不在后台。

在后台我得到错误:

Error Domain=NSOSStatusErrorDomain Code=560161140“操作无法完成。(OSStatus 错误 560161140。)”

是否有可能在后台播放(在自定义事件上)和在 f.e. 之间切换这两种组合? music.app 和我的应用在后台是不可能的?

这是我的播放器型号的代码:http://pastie.org/4830995

【问题讨论】:

    标签: ios audio background avplayer


    【解决方案1】:

    我认为您的问题可能与后台处理有关。您需要在应用委托上覆盖此功能。

      - (void)applicationDidEnterBackground:(UIApplication *)application
    {
     __block UIBackgroundTaskIdentifier task = 0;
     task=[application beginBackgroundTaskWithExpirationHandler:^{
         NSLog(@"Expiration handler called %f",[application backgroundTimeRemaining]);
        [application endBackgroundTask:task];
        task=UIBackgroundTaskInvalid;
    }];
    
    }
    

    除非播放声音,否则您的应用程序将在 6 分钟后被终止。如果您的用户将计时器设置为超过 6 分钟,您可以做的是每 5.5 分钟播放一次简短的声音,以使您的应用程序保持活力并开始新的后台任务。此外,您还必须考虑很多事情不会在后台执行。我做了一些与您正在做的事情有些相似的事情。我所做的是创建 NSObject 的自定义子类来处理音乐播放和应用程序过期的东西。并使其成为我委托的强大属性,因为许多功能和通知不会在后台运行在您的 VC 上。

    虽然如果您只是想播放声音,这可能不是最好的方法。也许只发送本地通知就可以了。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回复。这很高兴知道,不知道这一点。但是我将测试中的计时器设置为〜20秒。问题已经出现在那里。它设置了计时器。关闭应用程序。 20 秒后出现错误。
    • 嗯,你可以制作示例项目并发布链接吗?
    • 这里是演示项目stringcode.co.uk/random/BackGroundSoundsDemo.zip的链接,这是我在后台播放声音的方式。这里的要点是,如果您的应用程序在进入后台时没有播放声音,它将变为非活动状态。当您停止在后台播放声音时,它也会变为非活动状态。因此,当您停止在后台播放声音时,请为 backGroundTimeRemaining - 0.10 设置计时器并播放一些快速的声音。这将重置您的 backroundTimeRemaining。希望对您有所帮助。
    • 非常感谢您分享您的项目。效果很好。但实际上,当应用程序在后台时,您正在使用 kAudioSessionProperty_OtherMixableAudioShouldDuck 来回避音频。如果您移除闪避并调用 [[AVAudioSession sharedInstance] setActive:NO withFlags:AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation error:&sessionError];在 audioPlayerDidFinishPlaying 上,当 [[AVAudioSession sharedInstance] setActive: YES error:nil];被调用。
    • 闪避对我的问题来说是一个很好的解决方案,但不幸的是它无法指定闪避音量......例如到 0 :(
    【解决方案2】:

    您是否已将您的应用注册为作为音频应用在后台继续运行?为此,请将UIBackgroundModes 键添加到您的Info.plist 文件并将其值设置为audio

    【讨论】:

    • 是的,如上所述“我在我的 plist 中将背景模式设置为“应用程序播放音频””,但我在几个线程中读到背景模式从 ios5 开始不再有任何效果。跨度>
    • 对不起,我不知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    相关资源
    最近更新 更多