gra*_*ukt 26 java audio android unity-game-engine
我正在制作一个游戏,我想在我的游戏运行时检测其他东西是否已经在播放音乐(或开始播放音乐)。如果是这样,我会淡出游戏中的音乐并继续播放音效。我正在使用 Unity 和 FMOD 进行音频播放。
尽我所能告诉 Android 提供了两种不同的方法来做到这一点:AudioManager.isMusicActive和AudioManager.OnAudioFocusChangeListener。
AudioManager.isMusicActive
不适用于我的特定情况,因为 Unity/FMOD 注册本身的方式似乎会使这始终返回 true。
AudioManager.OnAudioFocusChangeListener
让我检测另一个应用程序是否请求音频焦点,但无法检测我是否可以安全地再次请求它。
我不知道 Unity/FMOD 如何设置音频会话,但默认是播放声音而不管后台播放的任何其他内容。所以,如果我只知道是否有其他东西在播放,这将很容易!
有没有办法判断除了我自己的应用程序之外的东西是否正在播放音乐?
注意:当我说音乐时,它也可能是有声读物、播客或最接近的等价物。
似乎有可能寻找任何正在进行的媒体播放通知,但这需要升级的权限,这对于这么小的功能来说似乎太大了。
以下是一些解决方案的候选者:
AudioFocusRequest.setAcceptsDelayedFocusGain这可以请求音频焦点时指定的,但只有真正意味着我不需要关注现在,以后也可以。但是,如果其他任何正在播放未“锁定”的音频,我将窃取音频焦点,停止它并且在此过程中不提供更多信息。
AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK最初似乎很有希望,但这取决于其他应用程序请求音频焦点将自身指定为瞬态(即通知声音或类似声音),并且对我检测更长形式的外部音频播放没有任何好处。
BroadcastReceiver/MediaNotifications,这是Spotify 的实现,但我只能说这需要我的应用程序内部为我想要确认的每个播放器提供特定支持,以及启用广播的用户。可能有用,但似乎很脆弱。
Atm*_*mas 15
先回答你刚才的问题大胆,你可以尝试使用requestAudioFocus
与AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE
标志。独占意味着没有其他东西可以播放,因此应该返回 AUDIOFOCUS_REQUEST_FAILED 或 AUDIOFOCUS_REQUEST_GRANTED 这应该给你一个代理回答你的问题“除了我自己的应用程序播放音乐之外”。
您是正确的,侦听器不会告诉您是否可以安全地请求访问权限,但他们可以告诉您何时可以安全地开始播放.. 只要您的应用程序最初加载或前台(假设它尚未播放)就发出请求音乐)。如果你被授予,玩,否则不要玩。如果您没有立即访问,请不要担心,因为您可以有一个侦听器,它会在稍后授予您访问权限时等待(即几秒钟后在地图结束时说出方向,或者几分钟后其他长期音频源停止)。
据我所知,这是对生命周期的较长时间。
一旦您的应用程序启动(或在前台运行时),请求 AUDIOFOCUS_GAIN。如果没有播放,您将获得音频焦点并可以开始播放。如果正在播放某些内容,您可能无法立即获得音频焦点,因此不应开始播放。如果您没有开始播放,请确保在您的 FocusChangeListener 中收听“AUDIOFOCUS_GAIN”。收到这条消息意味着你可以开始玩了!
不要担心“锁定”其他人。只要您提出了合理的请求 AUDIOFOCUS_GAIN(这是合理的,因为您打算将音频用于您的游戏并且您打算使用它超过 15 秒)然后从另一个应用程序接管音频是有意义的,因为您的应用程序是被前景化并且应该接管主要音频。但是,在您的 OnAudioFocusChangeListener 中,您应该成为一个好公民并监听如果用户切换回 OTHER 应用程序或其他东西暂时弹出时可能发生的 LOSS 事件,您需要暂停/静音或降低音量/躲避自己因此。
通过这种方式,您可以编码您的应用程序是否处于前端和中心位置,或者是否被告知要安静和安静多长时间。这使您不必担心谁/什么/为什么/有多少其他应用程序退出以及对音频执行某些操作,而是专注于简单地协调和响应音频管理器的指令,直到您不再关心(即应用程序退出等)。
我发现这两个链接对于理解基础知识以及应用程序应该如何相互尊重非常有用。
最后一个链接是 Expo AV Manager。这并不是要提供 Expo 作为解决方案,只是我觉得 Expo AV 代码作为一个经过深思熟虑的示例,可以很好地说明在导航音频管理时可能遇到的条件组合以及哪些代码/成员变量可能对跟踪有用所有这些。还有不少“世博安永”框架的东西会在那个文件,它可以分散注意力,并忽略,但如果你只是看acquireAudioFocus
和onAudioFocusChange
我觉得有一些很好的启示应曾有。
对于一些代码和一个很好的概述
关于生命周期背后的哲学和基本原理,以及如何成为一名优秀的音频公民
来源:Expo AV Manager
最后一点,不要忘记做一个好公民,在不需要的时候放弃专注。即背景/前景,如果您的用户在游戏中关闭音乐等。
归档时间: |
|
查看次数: |
915 次 |
最近记录: |