代码之家  ›  专栏  ›  技术社区  ›  Bdebeez

混合使用AudioServicesPlaySystemSound和AVAudioPlayer可以吗?

  •  7
  • Bdebeez  · 技术社区  · 15 年前

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

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

    2 回复  |  直到 15 年前
        1
  •  8
  •   mahboudz    15 年前

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

        2
  •  9
  •   Bdebeez    15 年前

    编辑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产生的声音。