在线考试远程监考怎么落地?多路视频拉流与音频异常标记的一套实践
在线考试远程监考怎么落地?多路视频拉流与音频异常标记的一套实践
去年期末季,教务王老师几乎住在监控室:三十个考场、九百个机位,本校监考只有十二人。IT 小张说摄像机早就接进乐橙 App 了,可考试系统里仍是一屏一路、还经常黑屏。后来我们才明白:远程监考要过的第一关,不是「买更多摄像头」,而是把每路画面变成监考后台可批量调度、可并发拉取、可留痕的云资产。
为什么在线教育现在绕不开「远程监考」
机考、网课结业考、职业资格线上笔试——监管要求「能看清考生、能追溯过程」。纯客户端切屏检测防不住代考;视觉 + 行为 + 环境才是完整链路。对技术团队来说,难点通常落在三块:
| 痛点 | 表面现象 | 根因 |
|---|---|---|
| 多路看视频 | 监考端卡顿、只能轮巡 | 并发拉流无规划、码流选型不当 |
| 设备不可管 | 考前能预览,考中系统没画面 | 摄像机在 App 里,未进开发者资产池 |
| 「听见异常」 | 嘈杂、多人说话无标记 | 只有视频没有音频分析链路 |
乐橙开放平台适合已采用或计划采用乐橙 IPC/通道设备的教育机构与 SaaS 厂商:通过现行 OpenAPI 做设备绑定、分页查资产、按通道创建直播地址;对讲、云台等能力在设备能力集(如 AudioTalk、PTZ)里体现,由 SDK 或轻应用组件承接。音频异常检测本身不是平台内置的单一接口,而是你在拿到音视频流之后,在业务层做的分析——下文会写清边界,避免「平台一键 AI 监考」的误解。
我们的 MVP 边界(第一期砍需求)
产品最初想要「自动判作弊」——评审后收敛为:
第一期(4 周)
✓ 考场—机位—设备通道映射
✓ 开考前资产同步、在线状态巡检
✓ 监考墙多路 HLS(辅码流为主)
✓ 单路音量 RMS 超阈 + 持续时长 → 异常事件入队
✗ 人脸比对、姿态估计(第二期)
✗ 全考场同时主码流(带宽扛不住)
协议层坚持两点:只用文档现行 OpenAPI(统一 system + params 签名请求);不用已标明不再维护的旧版协议模块(例如老的 deviceList 查资产,改为 listDeviceDetailsByPage)。
总体思路
考场摄像机 → 乐橙云 → 监考后端(代调 OpenAPI)→ 监考 Web/客户端
↓
音频分析 worker(业务层,消费流或旁路采样)
↓
异常事件 / 监考工单
密钥与签名只在服务端;考生端不持有 appSecret。直播地址短时签发、跟考试会话绑定,防止外泄长期有效链接。
1. 业务模型:考场—机位—通道
一场考试对应一个 exam_session;每个机位(或每个考生座位)映射到一台设备的某个 channelId:
exam_session
└── exam_room (考场)
└── seat (机位) → deviceId + channelId
分页同步设备时,把平台返回的 deviceStatus、channelList[].channelStatus 写入本地表。开考前 30 分钟跑巡检任务:非 online 的机位进「考前故障」列表,避免开考后监考才发现离线。
2. 平台调用壳与令牌(与巡店项目共用)
监考服务和门店项目共用一层网关封装。核心是:每次请求新 time/nonce,MD5 签名,POST 到 /openapi/{方法名}。
async function platformCall(method, params) {
const body = buildSignedBody(appId, appSecret, params);
const res = await postJson(`/openapi/${method}`, body);
if (res.result.code !== '0') throw new PlatformError(res.result);
return res.result.data;
}
accessToken 管理员令牌缓存约三天,遇 TK1002 刷新——监考高峰不要每个老师点击都重新鉴权。
3. 考前资产同步:listDeviceDetailsByPage
async function loadExamDevices(token) {
const seats = [];
let page = 1;
const pageSize = 50;
for (;;) {
const data = await platformCall('listDeviceDetailsByPage', {
token,
pageSize,
page,
source: 'bind',
});
for (const dev of data.deviceList || []) {
if (dev.deviceStatus !== 'online') continue;
for (const ch of dev.channelList || []) {
if (ch.channelStatus !== 'online') continue;
seats.push({
deviceId: dev.deviceId,
channelId: ch.channelId,
ability: dev.deviceAbility,
channelAbility: ch.channelAbility,
});
}
}
if (!data.deviceList?.length || data.deviceList.length < pageSize) break;
page += 1;
}
return seats;
}
绑定新考场摄像机时,仍走控制台或 bindDevice;踩坑:实施用教务个人号在 App 里添加,考试系统同步不到——改为开发者主账号绑定,验收标准写进考务 SOP:「分页列表出现 deviceId 且在线」。
读 deviceAbility / channelAbility 可提前知道是否支持 AudioTalk(对讲)、PTZ(云台)等,避免 UI 展示不可用按钮。
4. 多路拉流:bindDeviceLive + 监考墙
监考墙同时展示 N 路(我们生产默认 N≤16,可配置)。每路开考时由后端签发 HLS,辅码流 streamId: 1 降低带宽;抽检可疑机位再切主码流。
async function issueProctorStream(token, deviceId, channelId, hd = false) {
const data = await platformCall('bindDeviceLive', {
token,
deviceId,
channelId: String(channelId),
streamId: hd ? 0 : 1,
liveMode: 'proxy',
});
const stream = data.streams?.[0];
if (!stream?.hls) throw new Error('无可用 HLS');
return {
hls: stream.hls,
liveToken: data.liveToken,
coverUrl: stream.coverUrl,
};
}
并发规划(踩坑实录):平台按账号统计播放并发——同一通道多个监考在看算多路,一人看多路也算多路。三百机位不等于三百路同时拉满;我们采用 「分区监考 + 轮巡池」:每老师固定 12 路墙,其余机位 30 秒轮播,可疑位锁定高清。促销级考试日前用「预估在线监考人数 × 每人大路数」与运营核对带宽与路数额度。
前端多路播放器用网格布局;单路异常(缓冲失败)自动重试签发地址,三次失败标红并写审计日志。
5. 音频异常:平台给流,业务做判断
需要说清楚:乐橙提供的是带音频能力的视频流与设备能力;「异常检测」是监考系统自己的规则引擎。
我们第一期做法:
HLS 播放端(Web)→ Web Audio API 取 AnalyserNode
→ 每 200ms 计算 RMS
→ 连续超阈 ≥ 3s → POST 内部 /proctor/events
监考后台 → 对应机位高亮 + 截图(播放器 capture 或后端抓图任务)
示意(浏览器端,非生产完整版):
function watchAudioLevel(audioContext, mediaElement, onAlert) {
const src = audioContext.createMediaElementSource(mediaElement);
const analyser = audioContext.createAnalyser();
src.connect(analyser);
analyser.connect(audioContext.destination);
const buf = new Uint8Array(analyser.frequencyBinCount);
let overSince = 0;
setInterval(() => {
analyser.getByteTimeDomainData(buf);
let sum = 0;
for (const v of buf) {
const x = (v - 128) / 128;
sum += x * x;
}
const rms = Math.sqrt(sum / buf.length);
if (rms > 0.15) {
overSince ||= Date.now();
if (Date.now() - overSince > 3000) onAlert({ rms, at: Date.now() });
} else overSince = 0;
}, 200);
}
阈值要按考场标定:空调、走廊传声会让误报飙升。我们在考前空场 5 分钟做噪声基线,动态阈值 = 基线 × 1.8。
若需服务端分析,可对短时切片用 FFmpeg 抽音频轨算能量——仍在业务服务器,不依赖停维护的旧协议。
对讲能力:设备能力含 AudioTalk 时,可通过官方 OpenSDK 或 轻应用播放器组件 的 startTalk 做考中喊话警告;OpenAPI 的 bindDeviceLive 解决的是「看」,不是「喊话」,架构上要分层。
6. 监考会话状态机
未开始 → 资产巡检 → 进行中(拉流/监测)→ 结束(销毁播放地址引用)
↓
异常事件(音频/离线/人工标记)
考试结束不再保留 HLS URL 明文;审计保留「何时何人看过哪路」。
7. 架构图(落地)
┌──────────┐ ┌─────────────┐ ┌─────────────────────┐
│ 考场 IPC │──▶│ 乐橙设备云 │◀──│ 监考后端 │
└──────────┘ └─────────────┘ │ · Token / 签名 │
▲ │ · listDeviceDetails │
│ OpenAPI │ · bindDeviceLive 池 │
└──────────│ · 事件 / 审计 │
└──────────┬──────────┘
│
┌───────────────────────┼───────────────────────┐
▼ ▼ ▼
监考墙 Web 考务巡检大屏 异常工单队列
(多路 HLS + (在线率) (音频/离线)
音频 RMS)
边界与合规
- 隐私:告知考生监控范围与留存周期;画面与异常事件访问需 RBAC。
- 公平:网络差导致离线要有申诉流程,不能单因
offline自动判违规。 - AI 判作弊:人脸、姿态属算法层,需单独评估准确率与合规,别和「拉流」混为一谈。
- 旧接口:新立项统一
listDeviceDetailsByPage,勿从过期博客复制deviceList示例。
性能与稳定性
| 项 | 建议 |
|---|---|
| 码流 | 墙巡辅码流,复核主码流 |
| 并发 | 按账号限额规划;分区 + 轮巡 |
| 同步 | 设备列表定时任务,非每路播放时全量拉 |
| 时钟 | 签名时间 NTP 同步 |
| 考前 | 空场噪声基线、全链路试播 |
录像留痕
长期存证可结合云存储套餐(通道 csStatus 为 using 时)或本地 SD 卡回放能力——属于第二期「事后追溯」,与实时监考墙解耦。
小结
远程监考的技术底座,可以压缩成四步:设备进开发者资产池 → 分页同步在线通道 → 按考场批量签发 HLS → 业务层做音频/人工异常标记。乐橙开放平台提供设备云与现行 OpenAPI,适合教育机构、考试 SaaS 把「多路看视频」做成可运营能力;音频异常、作弊策略、考务流程仍在你的系统里迭代。
若你正在做在线教育、职业考试或校内机考产品,建议先用一台考场 IPC 走通:创建应用、绑定设备、分页列表在线、单路辅码流试播,再扩到监考墙。平台以视频技术与安全为核心,开放低代码组件与 OpenAPI,帮助开发者较低成本落地视频场景——监考、实训示教、在线答辩都属于同一类能力延伸。
注册与文档:在 乐橙开放平台 完成开发者注册,于控制台创建应用获取密钥;接口说明在平台在线开发文档中按方法名查阅(开发规范、分页查询设备详情、创建设备直播地址、设备直播说明等章节)。以上为项目实践记录,生产环境以平台最新文档与控制台配置为准。
更多推荐

所有评论(0)