【问题标题】:iOS AVAudioSession ducking is slow and synchronousiOS AVAudioSession 闪避缓慢且同步
【发布时间】:2015-06-27 15:25:35
【问题描述】:

在 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 应用?

【问题讨论】:

  • 同样的问题。你有没有找到解决这个问题的方法?

标签: ios objective-c audio unity3d avaudiosession


【解决方案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?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多