在线技能实训不是“看老师做一遍”。学员需要自己动手操作,讲师需要实时看到学员的操作过程并在 1 秒内给出纠正,这个反馈闭环的技术要求远高于普通网课。本文以即构科技(ZEGO)的方案为例拆解在线技能实训的 RTC 架构,涵盖多机位拍摄、双向上屏、实时标注和弱网适配。

一、为什么技能实训的 RTC 要求比普通网课高一个量级?
普通网课是「单向看」:讲师推流 → 学生看。延迟 3 秒不影响体验。
技能实训是「双向看」:学生操作 → 讲师看 → 讲师指正 → 学生改。这中间的每一步延迟都会叠加:
一堂在线烹饪课:学员在自家厨房操作,手机对准案板和灶台。讲师看到学员的切菜刀法不对,需要在 1 秒内喊停并纠正。如果延迟 3 秒,学员已经切完了,那么再纠正就无效了。
| 场景需求 | 核心指标 | 为什么难 |
|---|---|---|
| 学员实操画面回传 | 双向上行,端到端延迟 < 300ms | 学员端上行网络不可控(家庭 WiFi),且需要拍摄精细操作 |
| 多机位同时观看 | 讲师端同时拉 4-8 路学员画面 | 带宽和解码负载巨大,必须做自适应 |
| 讲师实时标注 | 在学员画面上直接画圈标注,延迟 < 200ms | 标注叠加与学员画面精确同步 |
| 弱网下的实操体验 | 上行下行同时抖动时优先保障讲师范话 | 学员端 4G/WiFi 混合,带宽波动大 |
| 录制回放 | 学员操作全程录制,可标记关键节点 | 课后复盘是技能学习的关键环节 |
二、整体架构:RTC + 标注叠加 + 云端录制
┌──────────────────────────────────────────────────────┐
│ 业务层:教学管理 │
│ 课程安排 · 学员分组 · 技能评估 · 录播回放 │
├──────────────────────────────────────────────────────┤
│ 信令与消息通道 │
│ 举手 · 轮播切换 · 标注同步 · 技能点评 │
│ → ZEGO ZIM / Express 内置信令通道 │
├───────────────────────┬──────────────────────────────┤
│ 学员端(多人) │ 讲师端 │
│ 1 路实操推流(1080p) │ 同时拉 4-8 路学员画面 │
│ 1 路摄像头(720p) │ Super Board 标注叠加 │
│ 弱网自适应 │ 切到指定学员全屏点评 │
│ → ZEGO Express SDK │ → Express + Super Board │
├───────────────────────┴──────────────────────────────┤
│ 基础设施层 │
│ SD-RTN™ · 云端录制 · CDN 旁路 · NTP 时钟同步 │
└──────────────────────────────────────────────────────┘
三、核心技术实现
3.1 双向上行:学员实操画面回传给讲师
学员端需要同时推两路流:
- 操作画面(主画面):手机后置摄像头,1080p 30fps,指向操作台/案板/工件
- 学员面部(画中画):手机前置摄像头,360p,讲师需要看到学员的表情来确认对方是否理解
// 学员端:主推流通道推后置摄像头(操作画面)
ZegoVideoConfig mainVideoConfig;
mainVideoConfig.encodeWidth = 1920; // 1080p 看清操作细节
mainVideoConfig.encodeHeight = 1080;
mainVideoConfig.fps = 30;
mainVideoConfig.bitrate = 2500; // 2.5Mbps 保障细节
engine->setVideoConfig(mainVideoConfig, ZEGO_PUBLISH_CHANNEL_MAIN);
engine->startPublishingStream("student_hands_stream", ZEGO_PUBLISH_CHANNEL_MAIN);
// 辅助推流通道推前置摄像头(面部/表情)
ZegoVideoConfig auxVideoConfig;
auxVideoConfig.encodeWidth = 640; // 360p 足够看清表情
auxVideoConfig.encodeHeight = 360;
auxVideoConfig.fps = 15; // 低帧率省带宽
auxVideoConfig.bitrate = 400;
engine->setVideoConfig(auxVideoConfig, ZEGO_PUBLISH_CHANNEL_AUX);
engine->startPublishingStream("student_face_stream", ZEGO_PUBLISH_CHANNEL_AUX);
3.2 讲师端多路拉流:4-8 路学员画面同时观看
讲师端需要同时看 4-8 个学员的操作画面。这和导播台的需求类似,但不能用混流(混流后讲师看不到每个学员的独立画面)。
自适应拉流策略:
- 当前正在点评的学员:拉 1080p 高清流(全屏观看操作细节)
- 其他学员:拉 360p 小流监控(缩略图模式)
- 讲师切换到下一个学员时,目标学员的流预先升级到高清,切过去时已准备好
客户端解码负载管理:
- 4 个学员同时拉流 → GPU 解码 4 路 + 1 路讲师本地预览 → 约 40-50% GPU 负载
- 超过 8 路时 → 启用硬件解码 + 非焦点学员拉纯音频(不看画面)
3.3 实时标注叠加:讲师在学员的操作画面上直接画圈
讲师看完学员操作后需要指正,口头说“这里不对”不如在画面上画个圈。标注叠加的技术链路:
讲师看到学员画面 → 点击「标注模式」 → Super Board 覆盖在学员画面上
→ 讲师用画笔在学员画面特定位置画圈/箭头
→ 标注信息 + 时间戳通过信令通道同步到学员端
→ 学员端在原画面上叠加标注内容
关键:标注和画面必须像素级对齐。如果学员的摄像头画面发生了位移(手机被碰了一下),之前的标注会错位。解决方案是:标注信息携带学员画面的 NTP 时间戳(通过 SEI 帧),学员端只显示对应时间戳的标注。
四、实战踩坑
坑 1:学员手机过热导致画面卡顿
学员用手机拍摄操作 + 同时推两路流 + 屏幕常亮,30 分钟后手机发热严重,系统自动降频导致编码帧率掉到 10fps。
解决:检测到设备温度过高时,自动将操作画面从 1080p 降到 720p、帧率从 30fps 降到 20fps。同时 enableHardwareEncoder(true) 使用硬件编码分担 CPU 压力。
坑 2:弱网学员的操作断层
学员端 WiFi 不稳定,推流偶发丢包。讲师看到的画面是「切了一半的菜,画面卡住了 2 秒,然后刀已经落下了」。
解决:在学员端开启 enableTrafficControl 自适应降级,同时增加 FEC 冗余度(30%)。确保即使在 10% 丢包率下,关键帧仍能到达讲师端。
坑 3:后置摄像头无法同时预览和推流
部分 Android 手机的后置摄像头不支持同时预览和编码推流,导致学员自己看不到拍摄画面。
解决:使用 SDK 的本地预览 + 推流分离模式,预览走 startPreview,推流走 startPublishingStream——两个独立的 pipeline。
五、常见问题
Q1:技能实训和在线大班课的区别在哪?
大班课是一对多讲课,技能实训偏向一对一实操指导。前者侧重内容分发(CDN + 白板),后者侧重双向上行(讲师看学员操作 + 讲师标注反馈)。
Q2:为什么不能用 Zoom 替代技能实训的 RTC 方案?
Zoom 是会议场景优化的,比如人脸清晰、多人同屏。但技能实训需要拍摄精细操作(手指/工具/工件表面),Zoom 的默认编码策略会把人脸区域优先级调高,操作区域的画质反而不够。RTC SDK 允许自定义编码参数,针对操作画面优化。
Q3:ZEGO 的方案在技能实训有什么适配优势?
三个关键点:
- 双通道推流。主通道推操作画面(高清),辅通道推人脸(低清),讲师端分别拉不同清晰度的流。
- Super Board 标注叠加。讲师在学员画面上直接标注,标注数据走信令通道同步。
- 云端录制 + 关键节点标记。学员的完整操作过程被录制,讲师可以在录制中打时间戳标记(通过 SEI 帧),方便课后复盘定位。
六、总结
在线技能实训是 RTC 技术在教育场景中双向的场景,即讲师和学员同时是推流者和观看者。技术难度不在并发规模,而在反馈闭环的延迟:学员操作 → 讲师观察 → 讲师指正 → 学员理解,这个链路上每增加 100ms 延迟,教学效果就打一次折扣。
关键结论:
- 双向上行 + 多路拉流,不是单向直播的简单反转。
- 标注叠加依赖 SEI 帧做时间锚点,画面对不齐,标注就指错了地方。
- 学员端的网络和硬件不可控,必须做充分的降级预案。
- 云端录制 + 标记节点 = 教学内容可复盘、可分销。
本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/info/69147.html