Iphone 混合使用AudioServicesPlaySystemSound和AVAudioPlayer可以吗?

Iphone 混合使用AudioServicesPlaySystemSound和AVAudioPlayer可以吗?,iphone,objective-c,audio,avaudioplayer,Iphone,Objective C,Audio,Avaudioplayer,我们有一款游戏即将发布,但我们有一个非常恼人的问题。在我们的Beta测试手机上,他听不到任何游戏中的声音效果。然而,他能很好地听到背景音乐和标题屏幕音乐 背景音乐和标题音乐都是通过AVAudioPlayer播放的(它们更长,我们需要循环和音量控制等)。声音效果只是通过AudioServicesPlaySystemSound播放(它们非常短,我们不需要精确的控制,也不需要知道它们何时结束,等等)。这适用于大多数iPhone,但不适用于这一款。所有这些都是通过AVAudioSessionCatego

我们有一款游戏即将发布,但我们有一个非常恼人的问题。在我们的Beta测试手机上,他听不到任何游戏中的声音效果。然而,他能很好地听到背景音乐和标题屏幕音乐

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

所以我有两个问题: -首先,这是一个可接受的实现吗?i、 是否有什么我没有注意到的,就是你不能混合这两个框架,或者为什么混合这两个框架是个坏主意? -第二,以前有人见过这样的事情吗?如果是这样,你有没有找到解决的办法


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

我在应用商店中有两个应用程序混合了这两个框架。AVAudioPlayer可播放需要启动和停止、音量控制的声音,AudioServices工具箱可提供简短的蜂鸣声和点击声。我脑海中唯一能想到的是,AVAudioPlayer的音量似乎是与AudioServices声音分开控制的。因此,检查以确保测试仪没有关闭声音(使用振动模式开关)或音量降低


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

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

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

如果您遇到类似情况,请让您的用户在玩游戏之前确保其铃声音量已调高,并且静音开关已打开(即未静音)。你也可以通过自己做测试来验证所有这些——降低你的铃声音量,增加你的应用内音量。你的系统声音应该从混音中消失

原始答案: 在重新翻阅所有文件的过程中,我找到了答案。我没有正确激活音频会话。以前,我只有以下代码来设置类别:

NSError *setCategoryError = nil; 
BOOL    categoryWasSet    = [[AVAudioSession sharedInstance] 
                              setCategory: AVAudioSessionCategorySoloAmbient 
                              error: &setCategoryError]; 
但我还需要添加以下代码来显式激活音频会话:

NSError *activationError  = nil;
BOOL    activationSuccess = [[AVAudioSession sharedInstance]
                              setActive: YES 
                              error: &activationError];
我已经对这个用户进行了重新测试,它已经完全修复了这个问题。希望这能帮助任何可能有类似问题的人


编辑:这似乎并没有解决问题。我的测试仪检测出一个假阳性,当进行更详细的检查时,他似乎没有真正听到SystemSound生成的声音。

我将把你的回答标记为已接受,因为你已经回答了我的主要问题(你能混合这两个问题吗)。我认为这个测试者的手机可能是一个侥幸,因为我已经看到它在其他一些手机上工作。我想知道是否值得向用户发送一个简单的测试应用程序,它可以播放两种声音,加上很多NSLog,比如音频设置和音量等。是的,这是一个好主意,我也在想同样的事情。如果我能找到任何有趣的东西,我会回来报告。奇怪的是,我能够在模拟器上重现这一点-我看到一条消息,设置类别时出错。我不知道该如何回应。我可能无法播放MP3标题音乐(因为没有该类别,我无法访问硬件解码器)。真正具有讽刺意味的是,当我让这个测试用户从他的手机中提取日志时,第一次测试运行是为了让日志真正工作并播放所有声音:)因此我认为这是一个相当确凿的结论,这主要是一个侥幸,可能与正确设置类别有关。后续:我最终像这样发布,但我把音响系统改成了OpenAL。混合使用OpenAL和AVAudioPlayer不会产生这一双通道问题(即,所有内容都在卷上结束,可在应用程序内部修改,而铃声卷被忽略)