录制、播放与广播
约 3338 字大约 11 分钟
2026-10-16
先读控制公共规则,再按 Topic、method 和方向查阅。应用侧使用鉴权命令提交、事件拉取与确认;事件结构不表示已启用 WebSocket 推送。能力可用性见支持范围。
recordingControl · SIG↑
- 方向:设备→平台;应答:recordingState。
- 触发、权限与状态:指令要求云端录制器,不推断设备本地录像能力。本地IPC录像计划仍走物模型。start先核验所有参与者同意再取流;新成员未同意暂停录制,撤权先停止取流。pause保留实例,不保存暂停期媒体;stop异步封装文件。
- 超时、幂等、迟到及清理采用本页公共行为和公共约定;成功应答不能代替独立完成状态。
- 场景:录音录像与媒体播放。
| 字段 | 类型 | 必填条件 | 值与含义 |
|---|---|---|---|
| operation | string | 必填 | start/pause/resume/stop |
| expectedRevision | uint | 必填 | 录制实例修订号 |
| recordingId | string | 必填 | 幂等录制实例ID |
| sourceTrackIds | string[] | start必填 | 授权轨 |
| consentIds | string[] | start/resume必填 | 所有被录者同意 |
| policyId | string | start必填 | 保留/访问/删除策略引用 |
{
"msgToken": "s15-35",
"method": "recordingControl",
"sessionId": "s15-session",
"params": {
"operation": "start",
"expectedRevision": 0,
"recordingId": "rec-1",
"sourceTrackIds": [
"mic-a",
"mic-b"
],
"consentIds": [
"consent-a",
"consent-b"
],
"policyId": "retention-policy"
}
}对应录音录像与媒体播放:M01;其他操作按条件字段校验。
recordingState · SIG↓
- 方向:平台→设备;应答:—。
- 触发、权限与状态:所有被录参与者收到状态通知;不能把受理当开始录制,或finalizing当文件可用。封装最多60秒,超时failed并回收临时数据;结束通话先停录,最终文件结果仍可按原session/recordingId投递,不能复活媒体会话。
- 超时、幂等、迟到及清理采用本页公共行为和公共约定;成功应答不能代替独立完成状态。
- 场景:录音录像与媒体播放。
| 字段 | 类型 | 必填条件 | 值与含义 |
|---|---|---|---|
| state | string | 必填 | starting/active/paused/finalizing/ready/failed |
| revision | uint | 必填 | 录制实例修订号 |
| recordingId | string | 必填 | 实例ID |
| contentRef | string | ready必填 | 鉴权录制文件引用 |
| durationMs | uint | ready必填 | 实际可播放时长 |
| reason | string | failed/自动paused必填 | 原因 |
| requestToken | string | 主动paused且无reason必填;其他后续事件可选 | 关联原控制token;自动paused仍必须reason,failed始终必须reason |
主动 pause 的独立事实携带 requestToken 且不携带 reason;自动暂停必须给出固定原因。无原因又无 requestToken 的 paused 拒绝,不能将未知中断解释为用户主动暂停。失败终态即使有关联 token 也仍要求原因。Go/C++ 严格解析器采用同一条件。
{
"msgToken": "s15-35",
"method": "recordingState",
"sessionId": "s15-session",
"data": {
"state": "starting",
"revision": 1,
"recordingId": "rec-1"
},
"code": 200
}对应录音录像与媒体播放:M02;其他操作按条件字段校验。
playbackControl · SIG↓
| 字段 | 类型 | 必填条件 | 值与含义 |
|---|---|---|---|
| operation | string | 必填 | load/play/pause/seek/setRate/stop |
| expectedRevision | uint | 必填 | 播放器修订号 |
| playbackId | string | 必填 | 播放实例 |
| contentRef | string | 仅load允许且必填 | 1~512字节授权文件或录像的opaque引用,不是下载URL或本地文件路径 |
| positionMs | uint | 仅seek允许且必填 | 目标位置,0是合法起点 |
| rate | number | 仅setRate允许且必填 | 0.5/1/1.5/2,不能用近似值 |
| mediaRevision | uint | 历史流必填,文件流禁止 | 本Peer媒体代次;初始1,seek按原持久在途意图切换到m+1,不等于expectedRevision |
所有uint取0~9007199254740991,mediaRevision必须大于0;缺必填字段、重复键、未知字段、显式null和字符串数字均拒绝。平台下行必须有正eventSeq及sessionId,不接messageSeq或code。play/pause/stop不携带contentRef、positionMs或rate,load不能夹带seek或倍率字段。引用可以有命名空间(例如asset:media-1),但不能把下载URL、绝对路径、路径回退或data:内嵌Base64直接塞入contentRef;此语法检查不替代媒体模块的归属、授权期限、重定向及SSRF检查。
历史分支仍设计接线待实现:仅load/play/pause/seek/stop,倍率固定1,setRate明确拒绝。seek在当前m受理,原token只保留一次m+1,先关闭旧Peer及播放缓冲再新建两个Peer;未完成新协商前不发新媒体。两端新Peer实际就绪后报告实际位置并保留原playing/paused意图,不能因重协商解除暂停。失败关闭新旧资源,不回退旧m;其他历史实例和实时预览不受影响。文件默认解析/执行入口仍拒绝mediaRevision,不将历史许可套为本地输出焦点。
实现状态:Go和可移植C++已有独立严格解析入口,共享C++另有异步文件实例执行层;生产播放器分派、真实驱动、焦点和MCP调用链尚未接通。 本组件不让设备上报已支持mediaPlayback,也不让播放命令开启麦克风或摄像头。现行AI及IPC运行时不因为存在解析器或执行状态机而自动支持播放器;接入与验证边界见支持范围。
{
"msgToken": "s15-43",
"method": "playbackControl",
"sessionId": "s-player",
"params": {
"operation": "load",
"expectedRevision": 0,
"playbackId": "player-1",
"contentRef": "<authorized-recording>"
},
"eventSeq": 1
}对应录音录像与媒体播放:M14;其他操作按条件字段校验。
playbackState · SIG↑
- 方向:设备→平台;应答:—。
- 触发、权限与状态:原token应答指实际状态,执行长操作先seeking,完成新事件playing;自然播放结束为ended,主动停止stopped,不能用网络发送完成替代。设备主动状态上报无code;平台按来源校验并通知原控制应用。
- 超时、幂等、迟到及清理采用本页公共行为和公共约定;成功应答不能代替独立完成状态。
- 场景:录音录像与媒体播放。
| 字段 | 类型 | 必填条件 | 值与含义 |
|---|---|---|---|
| state | string | 成功应答或主动事件必填 | loaded/playing/paused/seeking/ended/stopped/failed;失败应答不携带 |
| revision | uint | 成功应答或主动事件必填 | 播放器修订号;失败应答不携带 |
| playbackId | string | 成功应答或主动事件必填 | 实例;失败应答不携带 |
| positionMs | uint | 成功必填 | 实际位置 |
| rate | number | 成功必填 | 实际倍率 |
| reason | string | 失败应答或主动failed必填 | 固定脱敏原因;成功状态不携带 |
| durationMs | uint | 已知时必填 | 真实时长 |
| mediaRevision | uint | recordPlayback成功应答及主动状态必填;文件禁止 | 实际Peer代次;seeking为原m+1,迟到旧m由历史Owner/客户端隔离 |
原命令成功应答code=200,data必须含state/revision/playbackId/positionMs/rate(位置及修订号即使为0也不能省略);state不得为failed。失败应答code=4xx/5xx且data仅有reason,不夹带playing等成功字段;不使用202代替实际状态。设备主动状态事件不带code/eventSeq/messageSeq,loaded/playing/paused/seeking/ended/stopped沿用成功字段;主动failed仅含state/revision/playbackId/reason。已知durationMs不得小于实际positionMs。平台必须另核对原会话/实例/在途token/修订号和终态,语法通过不能让迟到playing复活已停止实例。
历史成功/普通自主状态另外必须含正mediaRevision且rate=1,自主failed另外含mediaRevision但不伪造位置;失败ACK仍严格仅reason,通过原token绑定旧操作。released是整个播放器所有代次的资源事实,不带mediaRevision或成功播放字段;不能以当前Peer关闭声称旧编码器/回调也已停止。解析通过不等于实际档案或当前媒体获得许可。
文件资源释放事实(独立正文)
复用playbackState,data仅下列三个字段,不含state/revision/位置/倍率,不带code/eventSeq/messageSeq。msgToken复用成功接收的原平台sessionEnded事件token,不是stop应答,不产生ACK。
| 字段 | 类型 | 必填条件 | 含义 |
|---|---|---|---|
| playbackId | string | 释放事实必填 | 原子会话固定播放器实例 |
| released | boolean | 释放事实必填且仅true | 驱动确认本实例整组输出实际释放 |
| endEventSeq | uint | 释放事实必填,大于0且不超过9007199254740991 | 原sessionEnded事件水位 |
{"msgToken":"s15-file-terminal","method":"playbackState","sessionId":"s15-file-child","data":{"playbackId":"player-1","released":true,"endEventSeq":9}}未知/断连/固定等待不能代替事实;缺省不代表释放,false/null和混合播放字段拒绝。平台按已鉴权Topic关联原企业/主体、固定播放器、Owner、终态token/水位及保留窗口;原事实幂等,不续租、不延长保留、不改变播放Actual或影响父AI。媒体许可到期不阻止实际释放收敛。Core解析/持久快照/正式RPC、Things严格鉴权转发及共享C++生成已分层实现;正式桌面MQTT文件宿主、焦点归还和完整MCP/E2E待接线。本地发布受理不保证平台持久收录,背压重试保持原字节。对应录音录像与媒体播放:M33。
主动失败示例(不是load命令失败的应答):
{"msgToken":"decode-failed-event","method":"playbackState","sessionId":"media-child","data":{"state":"failed","revision":3,"playbackId":"player-1","reason":"decodeFailed"}}原控制失败示例:
{"msgToken":"play-1","method":"playbackState","sessionId":"media-child","code":409,"data":{"reason":"resourceBusy"}}{
"msgToken": "s15-43",
"method": "playbackState",
"sessionId": "s-player",
"data": {
"state": "loaded",
"revision": 1,
"playbackId": "player-1",
"positionMs": 0,
"rate": 1,
"durationMs": 30000
},
"code": 200
}对应录音录像与媒体播放:M15;其他操作按条件字段校验。
broadcastControl · SIG↑
- 方向:设备→平台;应答:broadcastState。
- 触发、权限与状态:liveBroadcast使用WebRTC媒体,不等于文件群发。平台按每个接收设备建会话腿和权限,支持音频或音视频;分区名单取平台配置快照。emergency必须有紧急广播权限,仅抢占输出,不能因此开启被叫麦克风/摄像头。
- 超时、幂等、迟到及清理采用本页公共行为和公共约定;成功应答不能代替独立完成状态。
- 场景:实时广播分区与紧急插播。
| 字段 | 类型 | 必填条件 | 值与含义 |
|---|---|---|---|
| operation | string | 必填 | start/subscribe/unsubscribe/stop |
| expectedRevision | uint | 必填 | 广播组修订号 |
| broadcastId | string | 必填 | 业务广播组ID |
| zoneIds | string[] | start必填 | 授权分区 |
| sourceTrackId | string | start必填 | 已协商音视频源 |
| priority | string | start必填 | normal/emergency |
{
"msgToken": "s16-51",
"method": "broadcastControl",
"sessionId": "s16-session",
"params": {
"operation": "start",
"expectedRevision": 0,
"broadcastId": "broadcast-1",
"zoneIds": [
"zone-a"
],
"sourceTrackId": "broadcast-audio",
"priority": "emergency"
}
}对应实时广播分区与紧急插播:M01;其他操作按条件字段校验。
broadcastState · SIG↓
- 方向:平台→设备;应答:—。
- 触发、权限与状态:start受理为starting;各接收端媒体就绪才active或partial,离线端不阻塞其他端。实时广播不对离线端补播;若要补播需独立异步messageDeliver。结束释放各腿和焦点,恢复遵循focusState。
- 超时、幂等、迟到及清理采用本页公共行为和公共约定;成功应答不能代替独立完成状态。
- 场景:实时广播分区与紧急插播。
| 字段 | 类型 | 必填条件 | 值与含义 |
|---|---|---|---|
| state | string | 必填 | starting/active/partial/stopped/failed |
| revision | uint | 必填 | 组修订号 |
| broadcastId | string | 必填 | 组ID |
| recipients | Recipient[] | 必填 | 每端pending/connected/failed/ended及reason |
| requestToken | string | 后续事件可选 | 原控制token |
{
"msgToken": "s16-51",
"method": "broadcastState",
"sessionId": "s16-session",
"data": {
"state": "starting",
"revision": 1,
"broadcastId": "broadcast-1",
"recipients": [
{
"endpointId": "speaker-a",
"state": "pending"
},
{
"endpointId": "speaker-b",
"state": "pending"
}
]
},
"code": 200
}对应实时广播分区与紧急插播:M02;其他操作按条件字段校验。
更新日志
2026/10/17 03:27
查看所有更新日志
d04e1-docs(AI与音视频): 按公共主线与场景分支整合接入手册于
