ttplayer绿色版 ttsplayer( 四 )


作者:字节跳动技术团队链接:https://juejin.cn/post/6934987607088726053来源:掘金著作权归作者所有 。商业转载请联系作者获得授权,非商业转载请注明出处 。
针对该问题,我们通过监听 AVAudioSessionRouteChangeNotification 通知,来 hookcategory 的变化,AVAudioSessionRouteChangeNotification 在调用 setCategory:error: 时会触发,而不会在调用 setCategory:withOptions: error: 时直接触发,进而与上述方法形成了很好的互补 。
//添加对AVAudioSessionRouteChange的监听[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleRouteChangeNotification:) name:AVAudioSessionRouteChangeNotification object:nil];- (void)handleRouteChangeNotification:(NSNotification *)notification {NSNumber* reasonNumber =notification.userInfo[AVAudioSessionRouteChangeReasonKey];AVAudioSessionRouteChangeReason reason =(AVAudioSessionRouteChangeReason)reasonNumber.unsignedIntegerValue;if (reason == AVAudioSessionRouteChangeReasonCategoryChange) {AVAudioSessionCategoryOptions currentCategoryOptions = [AVAudioSession sharedInstance].categoryOptions;AVAudioSessionCategory currentCategory = [AVAudioSession sharedInstance].category;//在需要进行对audioSession进行修正的场景下(RTC直播),修改category时options未包含mixWithOther,则给options追加mixWithOtherif (shouldFixAudioSession&& !(currentCategoryOptions & AVAudioSessionCategoryOptionMixWithOthers)) {[[AVAudioSession sharedInstance] setCategory:currentCategory withOptions:currentCategoryOptions | AVAudioSessionCategoryOptionMixWithOthers error:nil];}}}报警机制即使有修改规范与兜底策略的保障,随着教室业务迭代与 iOS 系统升级,也无法保证线上完全不出现问题,因此我们建立了问题报警机制,当线上出现问题时,能在工作群里及时收到警报,根据警报的问题信息,通过日志进一步排查问题 。通过报警机制,我们可以更快速的对线上问题作出反应 , 不被动依赖于学生的投诉反馈,以最快的速度推进问题解决 。
当 RTC 声音被打断时,底层音视频 SDK 会回调警告错误码(如 agora 的 warningCode 为 1025),当出现对应的警告码时,结合 slardar 的报警功能 , 在飞书群里以消息的形式进行同步 。同时在 hook 到 AVAudioSession 的变更时,通过获取堆栈信息 , 可以定位到是哪个模块触发的更改,结合报警用户信息,可以更方便的定位问题 。
媒体声音被抑制媒体声音在媒体音量下开启播放,播放途中因为连麦而切换到了通话音量,此时因为系统特性,媒体音量会被通话音量抑制而导致声音变小 。
针对该问题,我们使用音视频 SDK 提供的混音、混流功能来规避 。基本原理是播放媒体资源时,我们拿到资源的 pcm 音频数据 , 将数据抛给 RTC 的 audioUnit 进行混合,由 RTC 音频播放单元统一播放,如果此时 RTC 使用的是通话音量,则媒体资源也是使用的通话音量播放,反之亦然 。以此来保证媒体资源与 RTC 始终保持统一的音量控制机制 , 而避免声音大小存在差异 。
混音是指给到音频的本地文件路径,或者播放的 url , 由 SDK 进行数据读取与播放 。混流是指针对视频文件,播放器只解码播放视频数据,将音频数据实时抛出来给到 SDK,SDK 将传入的实时音频数据与 RTC 音频数据进行混合与播放 。项目中我们使用点播 SDK TTVideoEngine 来实现视频播放与音频外抛 。
总结通过上线上述综合解决方案,声音问题得到了有效的解决 , 同时也能从容应对快速迭代的教室需求,有效提升了在线教室的体验 。
关于我们教育技术中台团队诞生于2020年3月,我们为字节跳动教育业务产品线提供强大的中台能力,覆盖产品包括清北网校、瓜瓜龙、大力智能灯、学浪等 。我们致力于互联网技术和教育行业的深度整合 , 提供高效的在线教育解决方案,满足用户多样化、个性化的教育需求 。团队技术壁垒高、技术氛围浓,是提升技术竞争力的绝佳机会,期待优秀的你加入我们!

推荐阅读