0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RTC脚手架的设计与实现(上)

jf_78858299 来源:网易云音乐技术团队 作者:AirLand 2023-05-26 16:48 次阅读

什么是 RTC?

RTC 即 Real-Time Communication 的简称是一种给行业提供高并发、低延时、高清流畅、安全可靠的全场景、全互动、全实时的音视频服务的终端服务。上面是比较官方的解释,通俗的来讲就是一种能够实现一对一、多对多音视频通话等众多功能的服务。目前提供该项服务的服务商有很多例如:声网、云信、火山引擎、腾讯云等。

背景

目前云音乐旗下 APP 众多,其中涉及到 RTC 业务的不在少数,例如:常见的音视频连麦、PK、派对房,1v1 聊天等。由于业务线不同,功能不同,开发者也不同,大家各写一套,不断的重复造轮子,因此为了避免重复的开发工作提升开发效率,需要有一套通用的RTC框架。

设计思路

在讲具体的方案设计之前,先讲一下我的设计思路:

  1. 功能内聚 :需要将功能都封装在一个容器里,对外通过接口提供方法调用
  2. 业务隔离 :不同的业务需要有不同的功能容器
  3. 统一调用 :所有功能容器需要有统一的调用入口
  4. 状态维护 :需要对状态进行精准维护
  5. 切换无感 :进行功能容器切换时候,无感知
  6. 核心可控 :对核心链路可监控,故障预警

基于以上 6 点,大致的架构设计如图所示,这里先不用深究图中的模块表示什么,后面会讲到,这里只是先了解一下大致的架构:

图片

image.png

接下来我就来讲讲具体的实现过程。

方案设计

前言:

RTC 的业务场景虽然很多,但本质上却相差无几,都是用户加入到一个共同的房间,然后在房间内进行实时的音视频通讯。具体到实际项目中大致又可分为两种:全场景 RTC 和部分场景 RTC。

  • 全场景 RTC :整个业务都是通过 RTC 技术实现例如:1v1 音视频通话、派对房等。
  • 部分场景 RTC :即整个业务链路中只有一部分使用了 RTC 技术,往往这种业务会涉及到引擎的切换。

不管是哪一种场景,承载核心功能的引擎都是必不可少的,因此我们首先就从引擎开始着手,另外为了方便描述,后续便将引擎统一称作 Player。

1、Player 的封装

在与 RTC 相关联的业务中会涉及到不同类型的 Player,例如:主播开播(推流 Player),观众观看直播(拉流 Player)以及 RTC Player等。它们的功能虽然各不相同,但用法却有相似之处,例如都有启动 start,终止 stop 等。因此我们可以将不同的 Player 抽象出一个共同的接口 IPlayer 相关代码如下:

interface IPlayer<DS : IDataSource, CB : ICallback> {
    fun start(ds: DS)

    fun stop()

    fun  setParam(key: String, value: T?)

    ......
}

其中 IDataSourceICallback 分别是启动 Player 所需要的数据源和回调,后面的文章中也会多次提到,特别是 IDataSource 它是 Player 启动的源头就好比打电话时的电话号码。

在这里遇到的一个问题点就是由于 Player 内聚了所有的功能除了有一些通用方法外,也有着属于自己特有的方法,例如:静音,音量调节等。这些方法众多而且各不相同无法在 IPlayer 接口中全部列出,即使能全部列出,但随着业务的迭代 Player 中的方法肯定会不断变化,不可能每更改一个方法就改一下接口,这显然不符合程序设计原则。那么如何将不同的方法抽象化,让上层通过调用同一个方法来执行不同的操作呢?这里通过:

fun  setParam(key: String, value: T?)

来实现,其中 key 表示方法的唯一标记,value 表示方法的入参。这样上层只需要通过调用 setParam 传入相应的方法标记和方法入参即可调用到对应的方法了。那么如何做到呢?答案也很简单通过一个中间层建立起一一映射关系。但是 Player 的类型众多,要是每写一个 Player 都要写一个映射逻辑就太麻烦了。所以这里通过 APT 编译时注解再结合 javapoet 自动生成这个中间层并给它命名为 xxxPlayerWrapper 其内部生成一个 convert 方法,在这个方法内部完成一一映射逻辑。接下来我们看看具体实现过程:

  1. 首先定义了两个注解分别作用于具体的 Player 和对应的方法例如:
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.TYPE})
public @interface PlayerClass {
}

@Retention(RetentionPolicy.CLASS)
@Target({ElementType.METHOD})
public @interface PlayerMethod {
    String name();
}

@PlayerClass
open class xxxPlayer : IPlayer<xxxDataSource, xxxCallback>() {

    @PlayerMethod(name = "key1")
    fun method1(v: String) {
        ....具体实现
    }
}
  1. 一一映射关系建立:

xxxPlayer 和 xxxPlayerWrapper 之间是一个相互依赖关系,互为彼此的成员变量。当调用 xxxPlayer 的接口方法 setParam(key: String, value: T?) 时,会直接调用到 xxxPlayerWrapper 的 convert 方法,convert 方法会根据 key 来找到其所对应的方法名,最后直接调用到 Player 的具体方法。

图片

image.png

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RTC
    RTC
    +关注

    关注

    2

    文章

    538

    浏览量

    66458
  • 腾讯云
    +关注

    关注

    0

    文章

    210

    浏览量

    16782
收藏 人收藏

    评论

    相关推荐

    利用爱星物联服务脚手架实现定制服务

    和相关工具,可能理解起来还是云里雾里,还是没法下手定制开发吧? 别急,理论指导实践来了。 本文介绍基于API脚手架和微服务脚手架构建自定义的对应服务,以及自定义服务怎么与爱星物联IoT平台服务进行交互 (内容属于下图红色线框部
    的头像 发表于 06-07 09:38 1977次阅读
    利用爱星物联服务<b class='flag-5'>脚手架</b><b class='flag-5'>实现</b>定制服务

    2010年迪拜五大行业展|迪拜建材展|紧固件|脚手架|建筑五金|卫浴|陶瓷|大理石

    ;建筑安全设备;混凝土-预制、建筑系统;建筑立面、盘座面及包覆;加热装置;模板/百叶窗;工具-空气、手动及电动;砌体-砖、预制、水泥、灰浆;螺帽、锚杆、螺丝、铰链等;建筑拆除;木材-框架及结构;脚手架
    发表于 09-06 15:51

    2011年沙特建材展|吉达建材展|五大行业展|紧固件|脚手架|玻璃|门窗|

    |吉达建材展|五大行业展|紧固件|脚手架|玻璃|门窗|2011年沙特建材展|吉达建材展|五大行业展|紧固件|脚手架|玻璃|门窗|2011年沙特建材展|吉达建材展|五大行业展|紧固件|脚手架|玻璃|门窗
    发表于 09-06 15:55

    2011年沙特建材展|吉达建材展|五大行业展|紧固件|脚手架|玻璃|门窗|

    ;nbsp;2011年沙特建材展|吉达建材展|五大行业展|紧固件|脚手架|玻璃|门窗|2011年沙特建材展|吉达建材展|五大行业展|紧固件|脚手架|玻璃|门窗|2011年沙特建材展|吉达建材展|五大行业展
    发表于 09-06 16:05

    悬挑式脚手架监理控制要点

    悬挑式脚手架一般有两种:一种是每层一挑,将立杆底部顶在楼板、梁或墙体等建筑部位,向外倾斜固定后,在其上部搭设横杆、铺脚手板形成施工层,施工一个层高,待转入上层
    发表于 12-15 14:29 15次下载

    脚手架的避雷方法

    搭设在旷野山坡雷击区的钢脚手架在雷雨季节应设避雷装置,避雷装置包括接闪器、接地极、接地线。
    发表于 01-19 15:26 18次下载

    物联网脚手架系统能带来什么益处

    横向移动不是脚手架上工人唯一需要担心的事情。超重载荷对立柱施加的压力过大可能会导致结构崩塌。平板下面的物联网传感器可以在压力成为问题之前测量到它。
    发表于 03-20 10:16 579次阅读

    科学家研发可溶解的植入骨折的脚手架材料——特殊绷带

    植入骨折的脚手架材料,能够促使身体自身的骨细胞长入其中并治愈骨折。而现在,科学家们开发了一种特殊的绷带,也可以做到这一点。
    的头像 发表于 09-25 11:30 1743次阅读

    脚手架挂牌方案需要符合哪些层面的规定

    脚手架挂牌的过程中,当然就必须应用到方案,即然是方案,又和生产安全有关,也就必须让它符合各个方面的规定,那麼必须让这类方案符合哪些层面的规定呢? 最先就必须让它符合机器设备构造的规定,由于生产线
    发表于 02-11 10:52 1373次阅读

    关于针对脚手架挂牌的归纳分析

    描述:用五金锁具锁定防护设备来防止很多人 随便操作过程安全防护的能量源或者机器设备,(脚手架挂牌)直到维修结束,五金锁具消除。 :运用衣服标签来警告别人早就被安全防护的能量源或者机器设备不能随便
    发表于 03-01 11:50 788次阅读

    为何需要脚手架挂牌,它的作用是怎样的

    脚手架挂牌是便于避免员工在进行维修、维修保养时,遇到来自设备的发生意外启动、出现异常启动、动力装置释放出所导致的风险性,以保证 员工的人身安全。进行脚手架挂牌操作程序的根本所在,断掉设备与动力装置
    发表于 03-05 11:39 1989次阅读

    脚手架挂牌的具体流程是怎样的

    第一步:提前准备工作  提前准备关闭能源。(脚手架挂牌)普遍的能源种类有(电磁能,机械动能,空气能热水器等......)和它的潜在性风险。放好防护维护装置(安全锁具),并提前准备关闭能源 第二步
    发表于 03-08 10:35 1508次阅读

    脚手架挂牌是什么,有什么作用

    上边的案例,看了后耐人寻味。有误实际操作脚手架挂牌,导致这么多可怜生命的身亡和资产的损害。由此可见恰当应用安全锁具,是一件多么的关键的事儿。温州市博士安全用品 解释一下什么叫脚手架挂牌?
    发表于 03-22 10:27 2041次阅读

    关于脚手架挂牌的有关定义表述

    对一个断开电源或是能源断开设备锁上,(脚手架挂牌)以防别人接入电源或能源(如开启闸阀) 的一种安全防范措施,或称锁上。 标识tagout 在一个断开电源或能源的断开设备挂上相对的警告或警示牌(如
    发表于 03-26 16:08 856次阅读

    RTC脚手架的设计与实现(下)

    RTC即 Real-Time Communication 的简称是一种给行业提供高并发、低延时、高清流畅、安全可靠的全场景、全互动、全实时的音视频服务的终端服务。上面是比较官方的解释,通俗的来讲就是
    的头像 发表于 05-26 16:48 654次阅读
    <b class='flag-5'>RTC</b><b class='flag-5'>脚手架</b>的设计与<b class='flag-5'>实现</b>(下)