在iOS中,我试图在播放一些音效时躲避音乐应用的音乐。如果你不知道,“躲避”只是意味着在播放我的声音之前音乐音量有点下降,然后播放声音,然后音乐音量恢复到初始音量。
对于躲避,我正在使用选项AVAudioSession
将AVAudioSessionCategoryAmbient
类别设置为AVAudioSessionCategoryOptionDuckOthers
,然后激活/停用会话(并显然播放中间的声音)。它运行良好,但音量变化似乎与调用在同一个线程中完成,并且应用程序在修改音量时挂起。
如果你想复制这个行为,我认为最快的路线是启动一个新的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本身中删除音乐应用程序?
答案 0 :(得分:1)
您可以尝试将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?