直播/短视频技术酷安音视频

iOS端音频模式 AVAudioSession

2021-04-14  本文已影响0人  Leoeoo

音频输出作为硬件资源,对于iOS系统来说是唯一的,需要通过“AVAudioSession”这个系统级全局对象对各个App进行控制。

控制路程如下图:


7GmDJTSBWag18Ae.png

常见音频场景

通过“AVAudioSession”可以做什么操作

AVAudioSession默认行为

系统会在app启动的时候,激活这个全局唯一的AVAudioSession

音频模式七大场景

该场景由7个类别分别控制:

会话类型 说明 引起App中断 录音和播放 当按“静音”或者锁屏是是否静音
AVAudioSessionCategoryAmbient 混音播放,可以与其他音频应用同时播放 只播放
AVAudioSessionCategorySoloAmbient 独占播放 只播放
AVAudioSessionCategoryPlayback 后台播放,独占 只播放
AVAudioSessionCategoryRecord 录音模式 只录音
AVAudioSessionCategoryPlayAndRecord 播放和录音,此时可以录音也可以播放 录音播放
AVAudioSession CategoryAudioProcessing 硬件解码音频,此时不能播放和录制 - - -
AVAudioSessionCategoryMultiRoute 多种输入输出,例如可以耳机、USB设备同时播放 录音播放

默认是:CategorySoloAmbient(独占播放)

上面介绍的七大类别,可以认为是设定了七种主场景,而这七类肯定是不能满足开发者所有的需求的。AVAudioSession提供的方法是,首先定下7种类别中的一种基调,再进行微调。AVAudioSession为每种Category都提供了些许选项来进行微调。

类别的选项

选项 适用类别 作用
AVAudioSessionCategoryOptionMixWithOthers AVAudioSessionCategoryPlayAndRecord, AVAudioSessionCategoryPlayback, AVAudioSessionCategoryMultiRoute 与其他后台App进行混音
AVAudioSessionCategoryOptionDuckOthers AVAudioSessionCategoryAmbient, AVAudioSessionCategoryPlayAndRecord, AVAudioSessionCategoryPlayback, AVAudioSessionCategoryMultiRoute 压低其他App声音
AVAudioSessionCategoryOptionAllowBluetooth AVAudioSessionCategoryRecord, AVAudioSessionCategoryPlayAndRecord 支持蓝牙耳机
AVAudioSessionCategoryOptionDefaultToSpeaker AVAudioSessionCategoryPlayAndRecord 默认用免提声音

七大模式

模式 适用的类别 场景
AVAudioSessionModeDefault 所有类别 默认的模式
AVAudioSessionModeVoiceChat AVAudioSessionCategoryPlayAndRecord VoIP
AVAudioSessionModeGameChat AVAudioSessionCategoryPlayAndRecord 游戏录制,由GKVoiceChat自动设置,无需手动调用
AVAudioSessionModeVideoRecording AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryRecord 录制视频时
AVAudioSessionModeMoviePlayback AVAudioSessionCategoryPlayback 视频播放
AVAudioSessionModeMeasurement AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryRecord AVAudioSessionCategoryPlayback 最小系统
AVAudioSessionModeVideoChat AVAudioSessionCategoryPlayAndRecord 视频通话

每个模式有其适用的类别,可以根据具体需要做对应的组合。

音频通知

系统中断通知

如果app正在视频通话,突然来电话了、闹钟响了等,最常用的场景是先暂停,待恢复的时候再继续。app可以通过监听系统消息:AVAudioSessionInterruptionNotification来处理。
系统消息userInfo主要包含两个键:

其他app占用通知

其他App占据AudioSession的时候用AVAudioSessionSilenceSecondaryAudioHintNotification来进行通知。其回调回来的userInfo键为:AVAudioSessionSilenceSecondaryAudioHintTypeKey

外设改变通知

默认情况下,AVAudioSession会在App启动时选择一个最优的输出方案,比如插入耳机的时候,就用耳机。但是这个过程中,用户可能拔出耳机,app可以通过监听系统消息:AVAudioSessionRouteChangeNotification来处理。

针对视频通话场景设置

类别:AVAudioSessionCategoryPlayAndRecord
类别的选项:
AVAudioSessionCategoryOptionAllowBluetooth
AVAudioSessionCategoryOptionDefaultToSpeaker
模式:AVAudioSessionModeVideoChat

如果想做录制一段音频,然后进行播放的操作。

建议录音修改为:
AVAudioSessionCategoryRecord或
AVAudioSessionCategoryPlayAndRecord
也就是支持录音的模式


image.png

建议播放修改为:
AVAudioSessionCategorySoloAmbient或
AVAudioSessionCategoryAmbient或
AVAudioSessionCategoryPlayback
也就是只播放的模式。

image.png
注意: 经过我的测试,播放时使用AVAudioSessionCategoryPlayAndRecord(录音播放模式),会导致播放声音很小。此时可使用AVAudioSessionCategorySoloAmbientAVAudioSessionCategoryAmbientAVAudioSessionCategoryPlayback,以解决声音小问题。

参考文章:
https://www.cnblogs.com/junhuawang/p/7920989.html
https://www.jianshu.com/p/3e0a399380df/

上一篇下一篇

猜你喜欢

热点阅读