ttplayer绿色版 ttsplayer( 二 )


目前行业内碰到的比较多的问题主要是听不见 RTC 声音与媒体声音被抑制 。
听不见 RTC 声音听不见 RTC 声音的主要原因是其他功能在设置 AVAudioSession 时 , AVAudioSessionOptions 未包含 AVAudioSessionCategoryOptionMixWithOthers 混音模式 , 导致 RTC 声音被高优进程打断 。比如在非混音模式下播放 webview 的内嵌音频,因为 webview 是使用系统进程来播放声音,优先级最高,所以 APP 进程下的 RTC 声音就会被抑制导致无法正常发声 。
这类问题一般都比较隐蔽,因为简单的场景如果有问题,在上线之前一般都能测试出来 , 而当多个功能场景串起来之后才触发问题 , 往往就很难在测试期间发现,且如果线上没有完备的日志查询体系,针对线上这类问题排查起来难度也非常大,往往因为定位不到原因而长期遗留 。
媒体声音被抑制在通话音量模式下 , 媒体声音会被压低,导致声音变小 。比较常见的场景是在小班场景下 , 学生在推流时播放课堂音视频等媒体资源 , 声音会比 RTC 的声音要?。贾旅教迳籼磺宄?。
通话模式下(连麦时)媒体声音会被压低,原因是 iOS 手机系统会开启回声消除以保证人声体验,因此会压低媒体通道的声音,也会压低背景音效 。
教育行业内部分头部 APP 也没有从根本上解决该问题,很多都是通过从产品功能层面上规避问题,通过产品妥协来为技术问题让步 。比如在播放课堂音视频资源时,默认将所有学生都强制关麦,关麦时学生处于媒体音量,就不存在被压低的问题了,等到课堂音视频播放结束后,再允许学生开麦 。这种通过规避问题场景来解决问题的方式,不具有可复制性 。
RTC 声音变小RTC 声音变小,主要原因是声音通过听筒发声,而没有正常通过扬声器发声,造成声音变小的假象 。另外在 iOS14 系统下 , 使用过 RTC 的通话模式并切回媒体模式后,再调用 setCategory:PlayAndRecord + DefaultToSpeaker 就会必现声音小的问题 。
解决方案针对上述行业痛点,通过底层原理的分析与实际项目经验,从代码规范、问题兜底、问题报警梳理出一套可行的解决方案 。
听不见 RTC 声音、RTC 声音变小RTC 的声音问题基本是因为其他模块功能对 AVAudioSession 进行了更改,且在功能结束之后,也没有将 AVAudioSession 重置到 RTC 需要的设置 。本身音视频 SDK(如 agora、zego 等)对这种情况会有一定的兜底逻辑,但是这种兜底如果存在侵入性,也是不合理的,因此具有一定的局限性 。
AudioSession 修改规范由于系统无法区分同一个进程中是哪个模块对 AudioSession 进行了更改,所以为了避免听不见 RTC 声音的问题,在使用 RTC 时,其它模块对 AudioSession 的调用更改,需要遵循以下原则:
模块调用 setCategory 前先判断下,当前 AudioSession 如已满足使用需要,不用再次设置 , 避免触发 iOS 14 系统 Bug模块需要录音时,Category 应该使用 PlayAndRecord(为了防止打断正在播放的音频,不要使用仅录音的 CategoryRecord),当前 category 不是 PlayAndRecord 的情况下再调用 setCategory模块仅需要播放时,当前 category 为 PlayAndRecord 或 Playback、Ambient 的情况下不需要 setCategory若当前的 category 不满足模块使用,在 setCategory 之前应该先保存当前的 AudioSession 状态 , 然后再 setCategory、使用音频功能 , 使用结束后,应该重新 setCategory 恢复到之前的 AudioSession 状态在设置 audioSession 时,categoryOptions 都应该包含 AVAudioSessionCategoryOptionDefaultToSpeaker 与 AVAudioSessionCategoryOptionMixWithOthers,iOS10 系统及以上还应包含 AVAudioSessionCategoryOptionAllowBluetooth 。核心代码如下:

推荐阅读