可以混合 AudioServicesPlaySystemSound 和 AVAudioPlayer 吗?

Posted

技术标签:

【中文标题】可以混合 AudioServicesPlaySystemSound 和 AVAudioPlayer 吗?【英文标题】:Is it OK to mix AudioServicesPlaySystemSound and AVAudioPlayer? 【发布时间】:2009-11-02 02:26:29 【问题描述】:

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

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

所以我有两个问题: - 首先,这是一个可以接受的实现吗?即有没有我错过的东西说你不能混合这两个框架,或者混合它们是一个坏主意的原因? - 第二,有没有人见过这样的东西?如果是这样,您找到解决方法了吗?

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

我想知道是否值得向该用户发送一个播放两种声音的简单测试应用程序,以及用于 AVAudioSession 设置和音量等的大量 NSLog。 是的,这是一个好主意,并且正在考虑同样的事情。如果我发现任何有趣的事情,我会回来报告。 奇怪的是,我能够在模拟器上重现这一点 - 我看到一条消息,指出设置类别时出错。我不完全确定如何回应。我可能无法播放 MP3 标题音乐(因为没有类别,我无法访问硬件解码器)。真正具有讽刺意味的是,当我让这个测试用户从他的手机中提取日志时,第一次测试运行以使日志真正工作并播放所有声音:) 所以我认为它非常有定论,这主要是侥幸,并且可能是相关的正确设置类别。 跟进:我最终是这样启动的,但我已经将音频系统改成了 OpenAL。混合 OpenAL 和 AVAudioPlayer 不会产生这种双通道问题(即所有内容都以音量结束,可在应用程序内部修改,并且铃声音量被忽略)【参考方案2】:

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

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

【讨论】:

我会将您的答案标记为已接受,因为您已经回答了我的主要问题(您可以将两者混合使用吗)。我认为这个测试人员的手机可能是侥幸,因为我已经看到它在其他很多人身上都可以使用。

以上是关于可以混合 AudioServicesPlaySystemSound 和 AVAudioPlayer 吗?的主要内容,如果未能解决你的问题,请参考以下文章

Sass 带参混合

Sass混合的使用

Vue 混合

混合云介绍

Sass 带参混合

高斯混合模型GMM核心参数高斯混合模型GMM的数学形式