AVAudioSession简介

这周,我将谈论一个小得多的话题,但这个话题与我的内心深处息息相关。 我从音频界开始从事iOS开发,我总是喜欢谈论Swift中的音频。 今天,我在写有关AVAudioSession的文章。

花一点时间考虑一下我们如何在应用程序中使用音频。 有时,我们会出现一些小错误和bloop来提醒用户某些事情。 其他时候,我们会提供游戏的背景音乐或视频中的声音。 有时,可以通过手机侧面的静音开关关闭声音。 一切都很好,但是如果我们有一个时钟应用程序,并且需要警报来覆盖该开关怎么办? 如果我们希望我们的应用在手机屏幕锁定时继续播放音乐怎么办? 当我们的应用程序播放声音而另一个应用程序播放音乐时会发生什么?

应用程序通过使用音频会话来处理此问题。 关于iOS应用中的音频的第一件事是,您的应用不会直接接触设备的任何音频硬件。 该应用程序通过中介与操作系统进行通信。 该中介是音频会话,特别是AVAudioSession。 看! Apple文档中的方便图形!

启动应用程序时,在幕后将为它提供AVAudioSession的单例实例。 我们的应用程序可以使用AVAudioSession的共享实例来配置应用程序中音频的行为(首先必须导入AVFoundation)。 要调整AVAudioSession的总体行为,我们可以将其设置为以下几类之一。 AVAudioSession具有一个简单的方法: setCategory(_:mode:options 🙂 。 请注意,您可以设置的类别由全局字符串常量表示,例如“ AVAudioSessionCategoryAmbient”

那么,这些类别中的每一个都有什么作用? 好吧,我不会遍历其中的每一个,因此,这里有一个方便的图表以获取更多详细信息。 AVAudioSessionCategoryAmbient是默认类别。 设置为此时,来自应用程序的音频将通过静音开关关闭,不会中断来自其他应用程序的音频,并且不会接受任何音频输入。 如果我们将类别设置为AVAudioSessionCategoryPlayAndRecord,则每个类别的情况都将相反。

重要说明:如果您打算在应用程序处于后台运行时播放音频,则必须更改info.plist文件中的某些设置。 幸运的是,Xcode有一个简单的方法可以做到这一点。 只需进入项目功能,打开背景模式,然后选择“音频,Airplay和画中画”即可。

在每个AVAudioSession类别中,可以设置许多模式,这将为您的会话添加更多功能。 同样,这些模式中的每一个都是由常量表示的字符串。 我想知道这些值是否是从较旧的Objective-C代码中遗留下来的,因为通常在Swift中,这看起来像枚举通常表示的那种。 无论如何, 这是每个列表 。 这些模式是针对特定用例进行优化的较小的性能调整。 例如,在具有多个麦克风的设备上,AVAudioSessionModeVideoRecording将打开最靠近该设备摄像机的麦克风。 仅当您设置了较大的类别AVAudioSessionCategoryRecord和AVAudioSessionCategoryPlayAndRecord时,它才起作用。

要考虑的另一重要事项是AVAudioSession的激活和停用,以及在激活或停用失败的情况下的错误处理。 首先,这是来自Apple文档的绝对荒谬的图像。 我发誓我没有化妆:

这是他们的…有关AVAudioSession激活工作原理的解释。 在适当的时间激活和停用音频会话非常重要。 如果您在激活音频会话后将其激活,则您的应用将崩溃。 这是直接从Apple文档中获得的所有内容 :

  let session = AVAudioSession.sharedInstance() 做{ // 1)配置音频会话类别,选项和模式 // 2)激活音频会话以启用自定义配置 try session.setActive(true)//设置为false停用会话 }将let错误捕获为NSError { print(“无法激活音频会话:\(error.localizedDescription)”) } 

所以你有它。 这些是AVAudioSession的基础! 总而言之,至少对于您日常使用的音频,这并不难理解。 有一个会话类别,称为“ AVAudioSessionCategoryMultiRoute”,变得有点复杂。 这使您可以将不同的音频流发送到设备上的不同输出。 除非您要构建某种音频混音器应用程序,否则我看不到您将如何使用它。 尽管如此,至少知道自己可以做到是一件很酷的事情。

今天就这些! 祝您周末愉快,并且一如既往地发表很多评论!