在 iOS 中,我试图在播放某些音效时隐藏音乐应用程序的音乐。如果您不知道,“闪避”只是指在播放我的声音之前音乐音量降低一点,然后播放声音,然后音乐音量恢复到初始音量。
对于回避,我将 AVAudioSession
类别设置为 AVAudioSessionCategoryAmbient
并带有选项 AVAudioSessionCategoryOptionDuckOthers
,然后激活/停用 session (并播放声音介于两者之间,很明显)。它运行良好,但音量更改似乎是在与调用相同的线程中完成的,并且在修改音量时应用挂起。
如果您想复制该行为,我认为最快的方法是启动一个新的 SpriteKit 项目,该项目将为您提供样本、船舶旋转项目。然后在touchesBegan:withEvent
方法中加入如下代码:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient withOptions: AVAudioSessionCategoryOptionDuckOthers error: nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
[[AVAudioSession sharedInstance] setActive:NO error:nil];
接下来在 iOS 设备上运行该应用程序,将一些音乐放入音乐应用程序中,然后触摸屏幕以创建船只并躲避音乐。您会听到躲避声,但也会看到屏幕上的船只卡住。
这正常吗?在执行回避时避免应用卡住的最简单方法是什么?
顺便说一句,我在 iOS 8.1 上使用 iPhone 5S。另外,我在 Unity3D 插件中使用它。我如何从 Unity 本身中隐藏音乐应用程序?
您可以尝试将 AVAudioSession
调用放在不同的线程上。这样他们就不会阻塞主 (UI) 线程。这尤其适用于 setActive
,它需要很长时间才能完成。
dispatch_queue_t myQueue = dispatch_queue_create("com.myname.myapp", nil);
dispatch_async(myQueue, ^{
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient withOptions: AVAudioSessionCategoryOptionDuckOthers error: nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
});
这个问题似乎也很相关:iOS AudioSessionSetActive() blocking main thread?
Tôi là một lập trình viên xuất sắc, rất giỏi!