在线教育场景下客户端实践与优化——RTC服务在线教育

news2024/11/23 18:43:20

在线教育场景下对提供稳定、高质量的音视频服务提出了非常高的要求。而不断推陈出新的课堂形式以及新技术的应用,使得好未来自研音视频SDK面临更多的挑战。

LiveVideoStackCon 2022北京站邀请到好未来音视频开发高级专家郭晓明介绍好未来自研SDK在工程化上所做出的努力,包括遇到的各式各样的挑战以及所采用的对策;同时介绍好未来客户端如何在以客户体验为主旨的前提下,合理调度自研与第三方服务,以提供更加良好的课堂体验。

文/郭晓明

整理/LiveVideoStack

大家好,我是郭晓明,我分享的主题是在线教育场景下客户端的实践与优化。

4d0deac90a8a1d7ca1448784d8ec2eb7.png

我先做个自我介绍。我来自好未来直播中台客户端团队,主要提供多引擎支持的RTCSDK,并为前台提供基础的音视频服务。除了RTC,也包括点播云等等各项能力。目前我们的客户端团队为大班云、素质、学习云、1V1,包括大学生等很多的业务线、多个场景都提供了支持。目前我们的自研引擎在很多的业务场景之下都占比超过了90%。

本次分享分为六个部分,第一是在线教育应用的特点,第二是RTC的典型场景,第三是核心指标。第四,在这些场景之下有哪些优化策略,第五是全面的支撑体系,第六是未来的挑战。

-01-

在线教育应用特点

第一个特点是高质量,高稳定性。这是有别于其他RTC场景的特点。没有一个应用能够像在线教育这样要求这么高的质量。一个字,就是稳。为什么要求这么稳?

40637cb5daf5332d3e733704df872fdf.png

这里引用了一个示例如图:老师的网卡、软件卡,还有闪退、黑屏什么的,老师讲课需要连贯性,上面这些情况出现一种,调动起来的积极性就没了,出现个两三种,这堂课就白上了。就是说,除了平时的一些质量要求,它(在线教育)要求讲课需要连贯性,过程中不断积累,到了最核心的那一刻——啪——卡了,那就不行了,这堂课就白上了。

第二个特点就是多:业务角色多、课程模式多、业务场景多。

186de0e071d1f1121bf56a9ad28be3b6.png

为什么角色多?老师有主讲老师、辅导老师、监课老师。学生分组的时候是同组学生,上完台是上台学生。家长还要旁听。

直播模式分为三分屏、半身、全身、小灶课、真小班、优网、自习室。课程模式多。

15907c7d1b2f2171aec60d862e99a718.png

接着是复杂的业务场景。旁路转推、跨房间推流、辩论会、辩论赛,一共列全了有50多个。

54d9b8067561ea29ef5e37803242b8af.png

基于这两个相同的特点,引出SDK的设计理念。首先第一,易用性,得让业务用得爽,简单点不容易出错。第二,可扩展性。灵活、迅速响应,设计的时候有没有足够的扩展性在里面。第三,数据驱动,详细可靠的数据支持。第四是安全合规。

-02-

典型的RTC场景

接着就是典型的RTC的一些场景。场景太重要了,刚才也提到场景很复杂,那到底是怎么玩儿的呢?我们看一下。

83239e4bb59e93593cf0fc3640e2b6d2.png

首先,举个3V3的例子。为什么举3V3呢?3V3是我们第一个真正全面使用RTC的场景,而且是一上线就取得了非常非常好的反馈的一个场景,就是从RTMP时代转型到RTC时代的标志性的点。这是一个三分屏的3V3。什么叫三分屏呢?老师的屏幕分为了三个部分,右上角是头像区,左边是课件区,右下是聊天区。为什么叫3V3呢?左边三个孩子,右边三个孩子,他们在一块儿互动,所以这是一个3V3的场景。它的整体图是什么样子呢?

08ee89ba3635ba234dd16870802f3ad8.png

如图所示。最上面的是老师的房间。学生以观众的身份进入老师的房间去拉流。这个房间会很大,有可能几万甚至十几万的学生都会在里面。另外学生会加入自己的一个小房间,就是刚才那个3V3的小房间。

家长怎么旁听呢?家长首先进入老师的大房间去拉流,也进入学生与家长的专门的一个小房间。

为什么这么做呢?因为我们的业务很多很多。家长跟学生之间的小房间形成一个规则,这样无论学生在哪个课程上课,家长都能够很容易地接听到自己的孩子。

11dceaf45dde6d043b88367b283de581.png

接着看第二个,左边的老师用了两个设备,一个是iPad,一个是安卓。

移动授课的老师通常用平放在桌面的iPad进行课件展示和绘图。这样就会有个问题,iPad的摄像头采集的是老师的下巴,老师还低着头,然后每个老师都变成了双下巴,那肯定不行。所以需要一个辅助设备在旁边当摄像头,这样就是两个设备。

但是两个设备会有一些问题。首先,最难的点是音视频同步。麦克风用安卓采集不行吗?如果有一天安卓设备坏了,或老师需要关闭视频,我们也需要保证老师能正常上课。iPad可以支持课件和语音,这堂课也是能够完整地上下来的。这就是它的一个设计理念。

另外一个需求是画板要跟老师的语音同步,我们加入音频SEI,根据SEI对齐课件的画笔,这样老师的语言跟绘画动作是在同一个时间轴里面的。

459752ea7927e48a1169c5b34dae97be.png

图中是AI课场景。云端下发一系列video list,由播放器SDK播放,真人互动的时候再唤起RTC SDK,然后再做交流。

bd398f4512614f2f1612f9ed97a77500.png

同屏小班课场景有多路流音视频的上/下行需求。

1615284b92604b1fd41592228353d1c6.png

例如,A只采用老师的麦克风;B包含课件信息、学生的发言;然后C是在某些特定条件下需要屏蔽某个发言。整个业务场景非常复杂。

286a8cda9e5e7c8fb2ce6c17a642e67a.png

有几种解决方案:首先是多进程。但不太友好,为了加一路流,需要客户端服务器整体改,还要能够找到老师的匹配规则。所以我们决定使用SDK支持同一个用户推多路的音视频流,目前客户体验和支持都比较好。

125320092aadcfe4a322b97b4de3740f.png

另外一个场景就是全员开麦,30多路流同时开始,还要选定多个设备进行语音增强、输出。这里面有一个优化点,稍后会讲到。

-03-

核心指标

在线教育都关心哪些核心指标呢?

3bdd53c2e618ece480e8af8897f91306.png

第一点,最关心的指标——客诉指标。第二卡顿,第三音画同步,第四延迟,第五性能。客诉指标是一个结果指标,如果下面四个做好了,客诉指标也会变得很少。

22327989d485034ab2f219da2bcff875.png

这是客诉指标的示意图。需要分析引起客诉的原因,针对用户的网络还有设备进行微调,解决相应问题。

f3192ca778b39d5daf93468f23869a2a.png

客诉指标显而易见,其他的数据指标如何来呢?

首先,其它数值指标在线上运行时要综合各家引擎的统一逻辑,形成统一的指标。第二,要建立一个科学的测试和评价体系。

ee21d701cee26d91876f2bcd24814f2e.png

为了进入第二点,我们就建立了音视频实验室,目前可以做到:第一,发版前进行验证,保证质量;第二,对友商进行评估并了解自身产品在行业中的位置;第三,帮助自身产品更新迭代,对成果进行验证;第四,可以学习音视频行业的评测技术和方法,提高能力。

从前期看我们投入了一些人力物力,几年过去了,我们觉得自身SDK的进步都离不开这一个音视频实验室的建立,可见当时的决策是正确的,做难而正确的事。

54c6a7545f717e1388c977e99296b9e1.png

目前实验室的音视频能力已囊括多方面,包括3A测试、音质测试、视频帧率、卡顿率、延迟、同步等等。

82e515f06862ea94ee625ff66758da61.png

接下来介绍一下全流程卡顿的测试方法。这是一个简单的推拉流流程,具体操作流程是:通过HDMI输入视频采集卡中,用分析终端进行高帧率的信息采集,然后判断视频是否有变化,如果没有变化,就认为是帧没有刷新过来。目前检测是程序帧间隔超过500ms为卡顿,卡顿率统计为卡顿时长/总时长。

0af865d53a1759a7cc5d0a417b095a2d.png上图是具体的卡顿计算方法

779057f7f9485b12345bf02098dfd848.png

接下来是全流程延迟测试方法:首先是推流端上生成一个时间戳二维码,然后由分析终端进行信息采集,与上面的(全流程卡顿测试方法)是一样的,只不过分析终端出来以后会分析二维码数据,二者就会形成时差即为视频延迟。

0f439cc1047b090ef0e7f040061ad62c.png

然后是音画同步。拉流端拉完之后将音频与视频分别放在不同的声道里。视频通过光敏电阻判断黑白块,黑的时候发出一个信号,白的时候发出一个信号,音频会检测特定的声音,通过分析左右声道里的时差来得到音画不同步的指标。

9ef1d0ddfdedc73436211abb7993a876.png

可以看一下计算方法,其实也很简单,一个左声道一个右声道,分析两个声道的时间差,大于200ms就认为触发了不同步。为什么是200ms呢,因为我们认为一个人平均1秒说5个字,所以200ms就可以了。但是调研团队认为英语的发音可能没有这么慢,是不是需要把数据进行更新,这还在我们的调研之中。

2b8f3a81e7e98565c2e820c8307ed810.png

另外一个就是我们比较关注的性能指标,目前较为关注CPU以及内存的数据。

-04-

场景下的优化策略

627ad659fee70948a7cd5bbacdb1a839.png

场景下的优化策略分六点去做:第一是优先拉流,第二是大小流,第三就是跨设备音画同步,第四是刚才所说的多拉流的一些优化,第五是AI课的回音问题,第六是流畅模式。

501953b692ee509179db3f38550373de.png

首先说优先拉流,其实在这个场景里很好做判断,老师的流比学生的流重要,当带宽评估不足的时候,会优先保证老师的流量码率,剩下的由学生进行平分。

653ee1366b0b3a4ebc8ad5948a309f90.png

第二个,大小流。例如在紧急的时候、看不见老师画面的时候提供一个解决方案,让用户还可以看见老师。我们的产品设计得很人性化:切流通知会经用户确认再进行操作。

95f82264472a92f5f715f820c7a9c73d.png

接着是优化结果,经过优先拉流、大小流的策略,卡顿率是明显有优化的。

cde2cfa0d1e071470b97f2f03f58800c.png

接着说跨设备音画同步是怎么做的?首先,各个端要进行中央时间戳的同步,包括信令服务器。当用户一进去的时候,第一时间和信令服务器进行同步,这样的目的就是为了防止和后续的一些周期性同步变得特别大。安卓是周期性进行netp校正,这样能保证音视频出来的时间戳是差不多的,再通知iOS和安卓去绑定音视频流,这样来做到音视频同步。

ad3268df732c24e928e55172d49d23ea.png图为NTP同步计算方式

d09853ef2851645d85774c5cb0307928.png

接着说拉多路音频的一些优化,第一个是我们进行了关键点的监控,检测出有没有性能问题;第二是优化策略,一个是静音包检测,静音包不参与解码;另一个是优先保证关键角色。

6273b3d6972ef0dbcc0463942a2337f0.png

大致流程是这样的。在Render现场里会有一个统计信息,同步到Mixer策略里面,决策哪些流可以进入后续的流程里。前面提到多流的时候老师可以设置关键角色,那么关键角色是老师,学生是接下来要保证的,最次级的是vad的引流。当出现问题,会按照优先级逐级去优化。

583a2ab7ddd8904e067f231c7c44dd3d.png

接着就是AI课的回声问题,如何解决回声问题?AI的视频是由RTC SDK播放并进行回音消除。第二,音画同步问题,RTC SDK通知播放器当前的剩余播放时长,进行一些优化。剩余的就是pause、seek等等细节的处理。

be02cae5a20d2d011ec3b697c40d3bdf.png

我们认为产生buffer的点是两个,一个是业务方,可以理解为APP;另一个就是RTC SDK的内部,这两个加起来就是buffer产生的点。我们会告知播放器目前有多少时长差值,这样就保证了音画同步。

2eddce0c89598a4e8f94a8ee712bd6cc.png

最后一个就是流畅模式:第一点是特定的老款机器默认不拉其他学生的流,只有老师;第二就是检查到卡顿,提示学生进入流畅模式关闭视频。

-05-

全面的支撑体系

没有全面的支撑体系,SDK就不会特别流畅地支持业务,要做到那些支撑呢?

97430c1c4536d184955924dcf5c4de53.png

第一点,关键点上报,目前应用到统计告警里面差不多有70个的指标,我们会将这些点统计上来,然后进行各种告警、各种事件的分析。

cb0de02d5d3197fc253dcd45ab7dded1.png

那么什么是关键点呢?第一,需要统计的点,第二,有助于解决问题的点。我这里有两个例子。一个是家长说,孩子爸爸一回家,孩子就没有声音了,最后发现是爸爸的蓝牙耳机的问题,我们给加上一个路由就好了。第二个是老师给学生上垃圾分类的素质课,好多学生录不上声音。后来发现,是因为这堂课学生经常会说“这个是什么垃圾”“那个是什么垃圾”,“垃圾”被识别为脏话,就被禁流了。

上报的注意事项有定时上报、压缩上报、限速上报、资源占用、丢弃策略。这五个点,每个点都是一种复盘。简简单单的上报,可能引起很多问题,要知道上报是不能和音视频抢资源的,无论磁盘还是网速、策略,都要做好。

47553e78efcfcdd15ddef6bc735fa648.png

然后就是全链路监控。刚才提到会有一些关键点上报,客户端及服务端都上报后就可以做自动化报警,例如哪个老师内存高了,哪个老师卡顿了,都可以做自动化报警和自动化归因,极大提高整体的客诉执行效率。

66ca9495b49bc415c995b1900fc63250.png

配置下发。我们可以做到:功能灰度上线、不同场景的差异化配置、不同机型的差异化配置。我们要求所有线上线下的功能都是可以回滚的,如果达不到这个功能就别上线。

c3dabab414556f332688151acd7bc96b.png

另一个就是全量日志的实时回捞。关键调用流程,很多时候出现线上问题,例如无声、黑屏,大概率是业务调用的问题,这时候要能精确地排查出业务当时的调用状态,呈现核心状态和流水信息。

3925e6f22971729a1b96293e71eb042e.png

这是全量日志的解析结果,它也是业务场景化自动测试的一个很好的数据源。

3b8d7585d54da29f04f5f22766082dc2.png

另一个很重要的点,测试人员不足怎么办?办法就是把人工变成自动化,降本增效。目前我们实现了以下几个功能,基本功能自动化,业务流程自动化,还有质量自动化。

1cac9ae695cf80496dc849163b9daf96.png

上图是质量自动化的一个示例。

2919d464dae8fd61253c9c79728d09b3.png

多引擎互备,多活双可用。目前我们可以做到核心业务必须是双引擎的,能够做到智能的调度,后续可能有些场景会做一些无感知的切换。

-06-

未来的挑战

81f4b767e2ff7d7ea911156c93cbd842.png

更加沉浸式的体验:老师带着去月球背面遨游的这种场景是传统行业感觉不到的。

438bffc2f60386e528c0dcd72325f3fb.png

另一个是越来越多的音画路数,The more the better,这是未来已经确定的。

f1457110661d67e5b1856ea2f579346d.png

多种多样的设备支持,如智能硬件、学习机、台灯。

aa317bf273e04684e162d4058ac4087d.png

最后是降本增效,首先是场景化编码优化,因为课件大概率是一些静态场景,肯定可以做一些优化。第二是更优的传输策略;第三就是行之有效的流程,通过流程去规范开发或者测试来实现降本增效;第四,向融合RTC靠拢。

我的分享就是这些,谢谢大家。

a578b61f41d2da80482c4660249ae2bc.png

扫描图中二维码或点击“阅读原文 

查看更多LiveVideoStackCon 2023上海站精彩话题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/714869.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【编译、链接、装载十五】系统调用与API——printf源码分析

【编译、链接、装载十五】系统调用与API——printf源码分析 一、系统调用介绍1、什么是系统调用2、Linux系统调用3、系统调用的弊端 二、系统调用原理1、中断 三、linux下系统调用实现1、 strace 查看可知,printf调用了系统函数write2、gdb调试查看——printf3、gdb…

实践|随机森林中缺失值的处理方法

动动发财的小手,点个赞吧! 除了在网上找到的一些过度清理的数据集之外,缺失值无处不在。事实上,数据集越复杂、越大,出现缺失值的可能性就越大。缺失值是统计研究的一个令人着迷的领域,但在实践中它们往往很…

并查集的讲解

什么是并查集? --是一个森林;(由多颗树构成的) 并查集原理 在一些应用问题中,需要 将 n 个不同的元素划分成一些不相交的集合 。 开始时,每个元素自成一个 单元素集合,然后按一定的规律将归于…

springboot开启热部署

第一步引入spring-boot-devtools依赖 <!--热部署--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><!--默认false改依赖是否可以传递&…

【Servlet】如何使用 Servlet 编写第一个 helloword 程序

文章目录 前言一、创建 Maven 项目二、引入依赖三、创建目录四、编写代码五、打包项目六、部署程序七、运行程序总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: &#x1f4d5; JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习…

transforms数据增强

在AI领域的模型训练中通常会遇到模型过拟合问题&#xff0c;通常采取的办法就是数据增强处理&#xff0c;例如在图像处理中&#xff0c;数据增强是指对原始图像进行旋转、缩放、剪切、翻转等操作&#xff0c;以扩大训练数据集的规模&#xff0c;提高模型泛化能力&#xff0c;降…

Gradio HTML组件详解

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

【23-07-03:HTTP协议的结构学习】

目录 HTTP 请求的结构HTTP 请求的整体架构请求方法&#xff08;Method&#xff09;请求路径&#xff08;URI&#xff09;GET 参数&#xff08;Parameters for GET)协议说明&#xff08;Protocol&#xff09;头部字段&#xff08;Headers&#xff09;请求体&#xff08;Body&…

论文与专利查找和下载

例如我想查找和下载视频理解(video understanding)相关论文 路线大纲如下&#xff1a; 一、最主要方式&#xff1a; 大纲&#xff0c;蓝色都是有超级链接的可以直接打开: 第一步 谷歌搜索(英文) 学校的知网(中文)第二步 下载论文(谷歌学术--英文 学校的知网--中文)下载不了…

CMA

文章目录 前言概念功能启用CMA 内存的创建方式一、使用 cmdline方式二、使用 dts CMA 内存分配和释放实例&#xff08;dts 方式&#xff09; 前言 在嵌入式设备中&#xff0c;很多外设&#xff08;如摄像机、硬件视频解码器等&#xff09;需要较大的内存缓冲区&#xff0c;kma…

clickhouse日志表占用大量磁盘空间

clickhouse日志表占用大量磁盘空间 sql&#xff1a; SELECT sum(rows) AS 总行数, formatReadableSize(sum(data_uncompressed_bytes)) AS 原始大小, formatReadableSize(sum(data_compressed_bytes)) AS 压缩大小, round((sum(data_compressed_bytes) / sum(data_uncompresse…

<DB2> 《IBM DB2 备份恢复实用文档》(第一部分)

[TOC](《IBM DB2 备份恢复实用文档》(第一部分)) 1 理论 1.1 关于备份恢复说明 a、DB2数据库备份和恢复的数据都是已经提交落地在磁盘的数据 。 b、DB2数据库备份和恢复使用的日志都是归档日志。 c、只有开启归档日志&#xff0c;才能进行在线全备、在线增备。否则只能进行离…

基于单片机智能手环心率老人防跌倒心率体温 步数里程

功能介绍 以STM32单片机作为主控系统&#xff1b; OLED液晶显示心率体温步数等信息&#xff1b;通过按键设置心率、体温上限设置&#xff1b;当心率或者体温超过按键设置上限蜂鸣器进行声光报警提醒&#xff1b;通过wifi模块esp8266把数据发送到手机端进行显整个电路以5v供电&a…

Three.js卡通材质实现简明教程

继 Harry Alisavakis 令人惊叹的汤着色器之后&#xff0c;我想使用 Three.js 重新创建类似的卡通着色效果。 我从 Roystan 的卡通着色器教程开始&#xff0c;它是为 Unity 编写的。 在这篇文章中&#xff0c;我将把 Roystan 教程中概述的原则翻译成 Three.js。 下面描述的着色器…

mysql索引之Hash

在存储引擎中Memory引擎是支持Hash索引的&#xff0c;Hash索引跟java中的HashMap很像&#xff0c;有很多槽&#xff0c;存的也是键值对&#xff0c;键值为索引列&#xff0c;值为这条数据的行指针&#xff0c;通过指针就可以找到数据。 但是Hash索引应用的并不多&#xff0c;原…

一篇文章解释清楚IOC和DI

背景 众所周知我们要学习Spring&#xff0c;必不可少的就是IOC和AOP&#xff0c;那就让我们了解一下什么是IOC&#xff0c;开启下面的学习吧。 过程 什么是IOC&#xff1f; Ioc—Inversion of Control&#xff0c;即“控制反转”&#xff0c;不是什么技术&#xff0c;而是一…

VSCode 2019 “对COM组件的调用返回了错误HRESULT E_FAIL” 的解决

问题&#xff1a; VSCode使用 “MFC应用”模板创建项目时&#xff0c;出现&#xff1a;文件夹打不开&#xff0c;并弹出 “对COM组件的调用返回了错误HRESULT E_FAIL” 错误 解决方案&#xff1a; 1. 以管理员身份打开Developer Command Prompt for VS 2019&#xff08;vs2…

敏捷开发发展和优缺点

目录 1 概述1.1 四种开发模式1.1.1 瀑布式开发1.1.2 螺旋模型1.1.3 迭代式开发1.1.4 敏捷开发 1.2 开发模式对比 2 敏捷开发2.1 敏捷宣言2.1.1 敏捷宣言解读2.1.2 敏捷宣言价值观 2.2 敏捷准则2.2.1 目的&#xff1a;是客户满意2.2.2 态度&#xff1a;欢迎需求变更2.2.3 关注&a…

加油,也可以更智慧

摘要&#xff1a;智慧加油站及油库管理系统的应用引擎是结合了华为云Roma Exchange能力&#xff0c;提升应用开发、部署和升级效率&#xff0c;支撑应用快速开发、远程部署。 停车、加油、驶离…… 从开车进场到离场&#xff0c;2分钟内即可完成“即加即走”的无感加油支付有没…

如何自动批量查询手机号归属地?

我们在工作生活中可能会收集到很多用户的手机号&#xff0c;我们如果想获取手机号归属地&#xff0c;只能一个个人工查询。如果数据量较多的情况就会比较耗费时间。有没有什么方法可以自动查询手机号归属地呢&#xff1f;当然可以&#xff0c;并且这个方法还是免费的。 首先&a…