混合AudioServicesPlaySystemSound和AVAudioPlayer可以吗?

时间:2009-11-02 02:26:30

标签: iphone objective-c audio avaudioplayer

我们有一款非常接近发布的游戏,但我们有一个非常烦人的问题。在我们的Beta测试者手机上,他听不到任何游戏音效。但是,他可以听到背景音乐和标题屏幕音乐。

背景和标题音乐都是通过AVAudioPlayer播放的(它们更长,我们需要循环和音量控制等)。使用AudioServicesPlaySystemSound简单地播放声音效果(它们非常短,我们不需要精确控制或知道它们何时结束等)。这适用于大多数iPhone,但不适用于此。所有这些都是通过AVAudioSessionCategorySoloAmbient的音频会话进行的。

所以我有两个问题:   - 首先,这是可接受的实施吗?即是否有一些我错过的说你不能混合这两个框架,或者为什么混合它们的坏主意呢?   - 第二,有没有人见过这样的事情?如果是这样,你有找到解决方法吗?

附加背景说明:我可以非常确切地说,在他的手机上,这是两个框架的混合。他能够听到声音,直到我们添加标题屏幕音乐的大致相同的构建。此外,如果我通过AVAudioPlayer更改其中一个声音,他就能听到它。不幸的是,我不能简单地将声音移动到AVAudioPlayers中,因为它根本不能很好地运行,我需要更好的同步。

2 个答案:

答案 0 :(得分:9)

编辑2
我已经确定了错误的原因。两个不同的音频框架在两个不同的音量设置上播放。有一个主音量(一旦你在应用程序中出现的内容,并且没有标题)和铃声音量(当你在主屏幕上没有加载任何应用程序时显示的内容)。 AVAudioPlayer调用主音量设置。由于我已将类别设置为AVAudioSessionCategorySoloAmbient(请参阅下面的代码),因此如果您在应用程序中使用音量摇杆,则会调整音量控制。但是,SystemSounds是在铃声音量下播放的。这不会出现在应用程序内部,因此不允许用户在游戏过程中调整其设置。

很容易看出用户可能会感到困惑:让我们说他们的铃声设置为低,甚至关闭。他们开始玩游戏。他们听到标题屏幕音乐(AVAudioPlayer)并能够上调或下调音量并正常响应。然后他们开始游戏并播放声音效果(SystemSounds),他们听不到任何声音,因为铃声音量很低/没有。为了听到声音效果,他们提高了音量,背景音乐也相应地响应。所以从这个角度来看,它看起来肯定不会播放声音效果。

如果您遇到类似情况,请让您的用户在玩游戏之前确保他们的铃声音量已经达到并且他们的静音开关已打开(即未静音)。您也可以通过自己进行测试来验证所有这一切 - 放下您的铃声音量并提高您的应用内音量。您的SystemSounds应该从混合中退出。

原始回答: 在重新挖掘所有文档时,我找到了答案。我没有正确激活音频会话。以前我只有这个代码来设置类别:

NSError *setCategoryError = nil; 
BOOL    categoryWasSet    = [[AVAudioSession sharedInstance] 
                              setCategory: AVAudioSessionCategorySoloAmbient 
                              error: &setCategoryError]; 

但是我还需要添加以下代码来显式激活音频会话:

NSError *activationError  = nil;
BOOL    activationSuccess = [[AVAudioSession sharedInstance]
                              setActive: YES 
                              error: &activationError];

我已经对这个用户进行了重新测试,它完全解决了这个问题。希望能帮助任何可能遇到类似问题的人。

编辑:毕竟这似乎没有解决问题。我的测试人员得到了误报,经过详细检查后,他似乎并没有听到SystemSound产生的声音。

答案 1 :(得分:8)

我在应用程序商店中有两个混合这两个框架的应用程序。 AVAudioPlayer用于需要启动和停止以及音量控制的声音,而AudioServices工具箱用于短暂的小哔声和咔嗒声。我能想到的唯一想法是,AVAudioPlayer的音量似乎与AudioServices声音分开控制。因此,请检查以确保测试仪没有关闭声音(使用振动模式开关)或音量调低。

如果这没有帮助,请告诉我有关您的声音/代码的更多信息,我可以在我的应用中添加一些代码,看看是否可以获得相同的行为。当然,听起来像你的大多数测试人员都没有这个问题,我也许也不会看到它。