iOS AVAudioSession回避缓慢且同步

时间:2015-06-27 15:25:36

标签: ios objective-c audio unity3d avaudiosession

在iOS中,我试图在播放一些音效时躲避音乐应用的音乐。如果你不知道,“躲避”只是意味着在播放我的声音之前音乐音量有点下降,然后播放声音,然后音乐音量恢复到初始音量。

对于躲避,我正在使用选项AVAudioSessionAVAudioSessionCategoryAmbient类别设置为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本身中删除音乐应用程序?

1 个答案:

答案 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?