iOS AVAudioSession 详解【音乐播放器的配置】

前言

在 iOS 音频开发中,AVAudioSession 是至关重要的工具,它控制着应用的音频行为,包括播放、录音、后台支持和音频中断处理等。对于音乐播放器等音频需求强烈的应用,设计一个合理的 AVAudioSession 管理体系不仅能保证音频播放的流畅体验,也能确保应用在多种使用场景下的稳定性。本文将基于苹果官方文档,详细介绍如何使用 AVAudioSession,并探讨在音乐播放器设计中如何合理管理 AVAudioSession。

一、AVAudioSession 的基础概念

AVAudioSession 提供了一个全局的音频会话来管理应用的音频需求。音频会话分为多个类别(category)和模式(mode),并支持多种选项(options)以适应不同场景。每个类别有其特定的行为和适用场景,例如是否支持后台播放,是否允许耳机和蓝牙播放等。音频会话配置完成后,通过激活音频会话来使配置生效。

主要概念:
1. 类别 (Category) :定义了应用的音频行为,决定了应用如何与系统中的其他音频(如电话或音乐)交互

官方文档:avaudiosession/category

常用类别:

• .playback

用于媒体播放,确保在静音模式下音频仍然可以播放。

• .record

专注于音频输入,如语音录制。

• .playAndRecord

允许同时播放和录音,适用于视频通话等场景。

• .ambient

适合背景音频,音频会在其他音频播放或静音模式下暂停。

• .soloAmbient

类似于 .ambient,但会在其他音频播放时自动静音。

• .multiRoute

支持同时向多个输出设备播放音频,如耳机和扬声器。

2. 模式 (Mode) :定义了音频会话的具体操作模式,影响音频处理的特定方式。通过选择适当的模式,开发者可以优化应用的音频行为,以适应不同的使用场景。

官方文档:avaudiosession/mode

常用模式:

• .default

默认模式,适用于大多数音频任务。

• .voiceChat

适合语音聊天,优化语音输入和输出质量。

• .videoRecording

针对视频录制,优化视频和音频的同步。

• .measurement

适合音频测量应用,确保最低延迟和最佳质量。

• .gameChat

优化游戏内语音聊天,确保低延迟和高质量。

3. 选项 (Options) :用于进一步细化和调整音频会话类别的行为,通过组合不同的选项,可以实现特定的音频需求。

官方文档:avaudiosession/categoryoptions

常用选项:

• mixWithOthers

允许与其他音频会话混合播放音频,适用于需要与其他音频同时播放的场景。

• duckOthers

在播放音频时,降低其他正在播放的音频的音量。

• allowBluetooth

允许使用蓝牙音频设备进行音频输入和输出。

• defaultToSpeaker

默认将音频路由到扬声器,而不是耳机。

二、AVAudioSession 不同场景的配置表

场景 类别 (Category) 模式 (Mode) 选项 (Options) 说明
音乐播放器 .playback .default 默认 : 空 特殊 : .mixWithOthers,允许与其他音频混合播放 在播放音乐时,默认情况下不需要特殊配置。特殊情况需要支持和与其他音频同时播放。
语音通话 .playAndRecord .voiceChat 默认 : 空 特殊 : .allowBluetooth,支持蓝牙通话 .defaultToSpeaker,通话时默认使用扬声器 通话场景一般无需特殊配置,但如果使用蓝牙设备或希望通话时自动切换到扬声器,则需要这些选项。
视频播放 .playback .video 默认 : 空 特殊 : .allowAirPlay,支持 AirPlay 输出 播放视频时一般不需特殊配置。若需要通过 AirPlay 播放视频,可以使用此选项。
语音识别 .playAndRecord .measurement 默认 : 空 特殊 : .defaultToSpeaker,默认使用扬声器 语音识别通常不需额外选项,但若需要确保输出清晰,可设置为使用扬声器。
游戏音效 .ambient .default 默认 : 空 特殊 : .mixWithOthers,允许与其他音频混合 .duckOthers,降低其他音频音量 游戏场景通常允许与其他音频混合。若需要强调游戏音效,可选择降低其他音频音量。
音频录制 .playAndRecord .default 默认 : 空 特殊 : .defaultToSpeaker,录制时输出使用扬声器 录制场景一般不需特殊配置,但若希望使用扬声器输出录制音频可设置此选项。
播放有声书 .playback .spokenAudio 默认 : 空 特殊 : .allowBluetooth,允许蓝牙音频输出 播放有声书时一般不需要特殊配置,若希望支持蓝牙播放则需此选项。
后台播放 .playback .default 默认 : 空 特殊 : .mixWithOthers,允许与其他音频混合 在应用后台播放音乐时,一般需要设置此选项以确保音乐继续播放。
语音导航 .playAndRecord .voicePrompt 默认 : 空 特殊 : .defaultToSpeaker,默认使用扬声器 .allowBluetooth,支持蓝牙音频输出 导航应用通常使用扬声器播放语音提示,若希望支持蓝牙设备则需额外配置。
录音与播放 .playAndRecord .default 默认 : 空 特殊 : .mixWithOthers,允许与其他音频混合 .allowBluetooth,支持蓝牙 在同时录音和播放音频时,需根据需求配置选项,以确保音频效果良好。
网络广播 .playback .default 默认 : 空 特殊 : .allowAirPlay,支持 AirPlay 输出 .mixWithOthers,允许与其他音频混合 在进行网络广播时,允许与其他音频混合播放,并支持 AirPlay 输出以保证流畅性。
声音提示 .ambient .default 默认 : 空 特殊 : .mixWithOthers,允许与其他音频混合 播放短声音提示时,通常不需要特殊配置,若希望同时播放与其他音频,则需此选项。

说明

  • 默认情况: 在没有特殊需求的情况下,Options 一般为空。
  • 特殊情况 根据应用场景的具体需求,选择适合的 Options 选项可以提升用户体验。例如,如果应用需要支持蓝牙音频或在后台持续播放,需明确配置相关选项。

正确配置 AVAudioSession 的类别、模式和选项对于提升音频播放和录制体验至关重要。根据应用场景灵活调整这些设置可以确保音频质量和用户体验。

三、音乐播放器中的 AVAudioSession 配置

在音乐播放器的设计中,我们需要支持后台播放、音频中断处理等。接下来我们将逐步设计 AVAudioSession 的配置和管理方法。

  1. 配置 AVAudioSession 的类别和选项
    音乐播放器的核心需求是播放音频,并支持在应用进入后台时继续播放。因此,我们可以设置音频会话的类别为 .playback。
    一般在播放管理类初始化时,配置一次就可以了

    //配置流通道
     func configureAudioSession() {
           do {
               print("AudioSession category is AVAudioSessionCategoryPlayback")
               try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [])
           } catch let error as NSError {
               print("Couldn't setup audio session category to Playback \(error.localizedDescription)")
           }
     }
    
  2. 激活和管理音频会话
    你可以在设置类别后的任何时间激活音频会话,但通常最好将此调用推迟到应用程序开始音频播放。延迟调用可以确保您不会过早地中断正在进行的任何其他背景音频。

激活:建议在开始播放时调用

func activateAudioSession() {
    do {
        try AVAudioSession.sharedInstance().setActive(true)
    } catch {
        print("Failed to activate audio session: \(error)")
    }
}

停用

停用当前音频会话,并通知其他应用继续播放;

在确定当前应用没有音频播放的情况下调用。

func deactivateAudioSession() {
    do {
        try AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
    } catch {
        print("Failed to deactivate audio session: \(error)")
    }
}
  1. 音频中断处理
    音频中断(如来电)是音频应用中常见的场景。在音频中断时,AVAudioSession 会发送中断通知,我们需要监听并处理这些通知,暂停当前播放,并在中断结束后恢复播放。

    NotificationCenter.default.addObserver(self, selector: #selector(handleInterruption), name: AVAudioSession.interruptionNotification, object: nil)

    @objc func handleInterruption(notification: Notification) {
    guard let userInfo = notification.userInfo,
    let typeValue = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt,
    let interruptionType = AVAudioSession.InterruptionType(rawValue: typeValue) else {
    return
    }

     switch interruptionType {
     case .began:
         // 中断开始,暂停播放
         pauseMusic()
     case .ended:
         if let optionsValue = userInfo[AVAudioSessionInterruptionOptionKey] as? UInt {
             let options = AVAudioSession.InterruptionOptions(rawValue: optionsValue)
             if options.contains(.shouldResume) {
                 resumeMusic()
             }
         }
     default:
         break
     }
    

    }

  2. 判断是否有其它应用在播放
    secondaryAudioShouldBeSilencedHint:一个布尔值,表示另一个具有不可混合音频会话的应用程序是否正在播放音频

    if AVAudioSession.sharedInstance().secondaryAudioShouldBeSilencedHint {
    print("有更高优先级的音频正在播放,静音当前音频")
    } else {
    // 正常播放音频
    print("无其他高优先级音频,可以正常播放音频")
    }

isOtherAudioPlaying:表示另一个应用程序是否正在播放音频的布尔值

if AVAudioSession.sharedInstance().isOtherAudioPlaying {
    print("检测到其他音频在播放")
    // 可选择使用 .mixWithOthers 选项进行混合播放
} else {
    print("没有其他音频在播放,可以独占播放")
    // 开始正常播放
}

总结

在音乐播放器中,AVAudioSession 是确保音频会话稳定和高效管理的关键。通过合理设置音频会话的类别和模式,结合锁屏信息展示和远程控制,我们可以提供流畅、贴心的用户体验。同时,注意音频中断处理和远程控制的配置,将让应用的音频体验更加完善和专业。

参考官方文档
documentation/avfaudio/avaudiosession


感谢您的阅读和参与,HH思无邪愿与您一起在技术的道路上不断探索。如果您喜欢这篇文章,不妨留下您宝贵的赞!如果您对文章有任何疑问或建议,欢迎在评论区留言,我会第一时间处理,您的支持是我前行的动力,愿我们都能成为更好的自己!

相关推荐
yngsqq2 分钟前
037集——JoinEntities连接多段线polyline和圆弧arc(CAD—C#二次开发入门)
开发语言·c#·swift
麦田里的守望者江18 分钟前
KMP 中的 expect 和 actual 声明
android·ios·kotlin
_黎明2 小时前
【Swift】字符串和字符
开发语言·ios·swift
ZVAyIVqt0UFji4 小时前
iOS屏幕共享技术实践
macos·ios·objective-c·cocoa
hfxns_5 小时前
iOS 18.2 Beta 4开发者预览版发布,相机新增辅助功能
ios
AirDroid_cn15 小时前
如何控制自己玩手机的时间?两台苹果手机帮助自律
ios·智能手机·ipad·手机使用技巧·苹果手机使用技巧
郝晨妤17 小时前
鸿蒙原生应用开发元服务 元服务是什么?和App的关系?(保姆级步骤)
android·ios·华为od·华为·华为云·harmonyos·鸿蒙
tealcwu19 小时前
【Unity踩坑】在Mac上安装Cocoapods失败
unity·ios·游戏引擎
名字不要太长 像我这样就好20 小时前
【iOS】iOS的轻量级数据库——FMDB
数据库·ios·sqlite·objective-c
@解忧杂货铺20 小时前
Android和IOS的区别
android·ios·cocoa