iOS AVAudioSession降低音量的速度较慢且同步性强。

5
在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本身制作Music app的鸭子效果?


同样的问题。你有找到解决方法吗? - Don Fitz
1个回答

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() 阻塞主线程?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接