在后台模式下播放音效

Posted

技术标签:

【中文标题】在后台模式下播放音效【英文标题】:Playing Sound Effects while in Background Mode 【发布时间】:2010-07-16 00:51:13 【问题描述】:

我需要在 iPhone 应用的背景中播放一些零星的音效。根据我在 ios 4 上阅读和体验的所有内容,只要我通过将“位置”指定为后台模式来运行 GPS,我就可以让我的应用程序在后台运行。这确实有效。但有时我想播放声音效果......换句话说,它不是我看到的“连续”声音。

但应用程序正在运行,为什么我不能只使用 AVAudioPlayer 播放一些音效?另一个声音 API 可以工作吗?

呸!

    NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"BEEP" ofType:@"aiff"];
NSURL *fileURL = [[[NSURL alloc] initFileURLWithPath: soundFilePath] autorelease];

AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];

player.volume = 1.0;
[player prepareToPlay];

// play
[player play];

【问题讨论】:

还有关于这个的更多信息吗?我已经在plist中设置了相关键,在调试器中可以看到播放音频文件的调用被执行了。我还为 AVAudioSessionCategoryPlayback 设置了音频会话,并使用 [[AVAudioSession sharedInstance] setActive: YES error: &activationError]; 将会话设置为活动状态。没有快乐。 我有完全相同的问题:/有什么想法或解决方法吗? :( 我可以让它运行,看看我的答案的变化。 【参考方案1】:

我认为澄清您的应用程序没有在后台运行很重要。相反,您的应用程序处于“休眠”状态。您指定的info.plist 后台进程值告诉操作系统它应该唤醒您的应用程序并允许它响应特定类型的事件。来自Apple Documentation

前面的每个值 [audio, location, voip] 都让系统知道您的应用程序应该在适当的时间被唤醒以响应相关事件。

在您的情况下,您的应用程序被冻结并且只能响应您指定的事件类型(位置或 GPS)。

您没有明确说明此代码所处的上下文,因此在这一点上很难告诉您为什么音频没有播放。此外,您需要确保您的应用程序出于指定目的在后台运行。如果您使用location 机制而不在您的应用程序中使用 GPS,您可能会在提交申请时被拒绝。

您可能还想参考Checklist for Supporting Multitasking 以确保您的应用程序的结构符合他们的要求。

【讨论】:

有什么关系?我正在从一个我知道正在运行的函数中调用 AVAudioPlayer,它会显示日志。 我应该添加我的应用程序确实在做 GPS,它是一种导航应用程序。我想在您靠近某些地标时发出音效。【参考方案2】:

[编辑] 您在此处监控 GPS 位置时有一个很好的后台播放示例:

http://www.informit.com/articles/article.aspx?p=1646438&seqNum=5

而且它使用的是<b>AudioToolbox</b> 而不是AVAudioPlayer

我已经使用 AVAudioPlayer 做到了。

您是否还在 info.plist 中为键 UIBackgroundModes 添加了 audio 值?

【讨论】:

【参考方案3】:

答案是它不适用于 AVAudioPlayer。请改用 AudioServicesPlaySystemSound API。

【讨论】:

我使用了 AudioServicesPlaySystemSound API 并获得了完全相同的行为:/ NSString* soundPath = [[NSBundle mainBundle] pathForResource:@"mySound" ofType:@"aiff"]; SystemSoundID soundId = 1024; NSURL* url = [NSURL URLWithString:soundPath]; AudioServicesCreateSystemSoundID ((CFURLRef)url, (SystemSoundID *)&soundId); AudioServicesPlaySystemSound(soundId);

以上是关于在后台模式下播放音效的主要内容,如果未能解决你的问题,请参考以下文章

小程序 - 音频能力介绍

在 Xcode 中播放音效

iOS,swift:无延迟播放背景音乐和音效

AVAudioPlayer 问题(如果设备被锁定,音乐文件不会在后台模式下播放)

在 Objective-C 中无延迟播放音效

同时播放两个声音c#