> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stmlink.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> 对外开放的服务端接口有两组前缀，都用同一套鉴权：`/server/v1/...`（SRTC 与 SMeeting 的主接口）和 `/stm/srvapi/v1/...`（SMeeting 的用户体系，服务端极简对接会用到）。鉴权是 app_id + nonce + timestamp + signature 四个请求头，用 app_key 做 HMAC-SHA256 签名，只能从业务方自己的后端调用。除这两组前缀外的接口均为内部接口，不要建议客户调用。
> app_key 是服务端密钥，绝不能出现在客户端代码、前端配置或移动 App 里。客户端加入频道用的 token 必须由业务方后端签发后下发（SRTC 走 `/server/v1/channel/grant`，SMeeting 走 `/stm/srvapi/v1/member/grant`）。
> SRTC 与 SMeeting 是上下两层不同的产品，术语不通用：SRTC 是音视频底座，说「频道 channel」「加入 / 退出」；SMeeting 建在 SRTC 之上，说「房间 room」「会议 meeting」「进入 / 退出」。回答时按用户所在的层用对应术语，不要把「房间」「会议」安到 SRTC 的接口上。
> 同一能力在各端 SDK 里的包名、类名、方法名并不相同。写示例代码时请使用文档中该端自己的 API，不要把一个端的写法套到另一个端上。苹果平台每个产品都有两套 SDK（Swift 原生与 Objective-C），两套 API 不能混用。

# 录制与 MCU

> 启动录制与混流、布局配置、任务状态监听与异常处理

录制建在 **MCU 合流**之上 —— 服务端把多路画面合成一路，既可以下发给客户端订阅，
也可以录成文件。

***

### 三种任务类型

`McuTaskType` 决定服务端做什么：

| 值                  | 说明              |
| ------------------ | --------------- |
| `record = 1`       | 纯录制             |
| `mix = 2`          | 纯混流（合成一路给客户端订阅） |
| `mixAndRecord = 3` | 混流 + 录制         |

***

### 启动与停止

```typescript theme={null}
import { McuTaskType, LayoutType, McuStartReq } from 'smeeting';

const req: McuStartReq = {
  taskType: McuTaskType.mixAndRecord as number,
  title: '产品评审录制',
  userName: '张三',
  layoutData: { layout: LayoutType.grids9 }
};

await meeting.mcuStart(meetingId, req);
await meeting.mcuStop(meetingId, McuTaskType.mixAndRecord);
```

<Note>
  `mcuStop` 要传**同一个 `taskType`** —— 服务端按类型区分任务。
  启的是 `mixAndRecord` 就不能用 `record` 去停。
</Note>

需要会议开始时自动录制的，在创建会议时设 `MeetingCreateReq.autoRecord = true`。

***

### 布局

```typescript theme={null}
const layoutData: LayoutData = {
  layout: LayoutType.grids9,
  pollingDur: 30,                     // 轮播间隔（秒）
  watermark: { type: 1, text: '内部资料', size: 24, color: '#80FFFFFF' },
  divList: [/* 分区配置 */]
};
await meeting.adminUpdateLayout(layoutData);
```

`LayoutType` 有 20 种预置：

| 类别      | 值                                                     |
| ------- | ----------------------------------------------------- |
| 自动 / 全屏 | `auto`、`full`                                         |
| 等分宫格    | `grids_2` \~ `grids_25`（2/3/4/5/6/8/9/10/12/16/20/25） |
| 主次布局    | `right_4`、`top_4`、`br_7`、`tl_7`、`tb_8`                |

`Cell.bindShare = true` 可以把某个格位绑定到共享画面。

<Note>
  `adminUpdateLayout` 影响的是**服务端合流的布局**，不是客户端本地的排版。
  本地宫格怎么摆是你自己的 UI 事。
</Note>

***

### 监听任务状态

```typescript theme={null}
onRoomMcuTask: (m, data) => {
  // data.taskType: McuTaskType
  // data.taskStatus: McuTaskStatus
  // data.errDesc: string
  switch (data.taskStatus) {
    case McuTaskStatus.running:
      this.recordingBadge = true;
      break;
    case McuTaskStatus.normal:
      this.recordingBadge = false;
      break;
    case McuTaskStatus.exception:
      this.recordingBadge = false;
      toast(`录制异常：${data.errDesc}`);
      break;
  }
}
```

<Warning>
  **`exception` 必须提示给用户。**

  录制出问题时用户一定要知道 —— 否则他们会以为整场都录上了，
  会后才发现没有。`errDesc` 里有原因，直接展示。
</Warning>

***

### 查询

```typescript theme={null}
const config: McuRecordConfig = await meeting.mcuRecordConfig();
const detail: McuRecordDetail = await meeting.mcuRecordDetail(meetingId);
```

| 接口                           | 用途                  |
| ---------------------------- | ------------------- |
| `mcuRecordConfig()`          | 应用级录制配置（默认布局、水印类型等） |
| `mcuRecordDetail(meetingId)` | 某场会议的录制明细（15 个字段）   |

`RoomInfo.recordStatus` 也能读到当前录制状态，进会时用它初始化 UI。

***

### 客户端订阅合流画面

大型会议不要 N 路各自订阅，改订 MCU 合成的那一路：

```typescript theme={null}
const mcu = await meeting.subscribeRemoteVideoMcu(hostUid);
// 渲染 meeting.mcuTrack
await meeting.unsubscribeRemoteVideoMcu();
```

客户端解码开销不随人数线性上升 —— 这是人多时的主要方案。

渲染就是把 `meeting.mcuTrack` 交给 `SRTCVideoView`：

```typescript theme={null}
if (this.meeting.mcuTrack !== undefined) {
  SRTCVideoView({
    track: this.meeting.mcuTrack,
    trackKey: 'mcu'
  }).width('100%').height('100%')
}
```

<Note>
  订了 MCU 就不要再逐路订阅同一批人的画面 —— 那是双份带宽。
  两种模式应当是**互斥**的，切换时先退掉另一种。
</Note>

***

### 录制文件在哪

录制产物走**资源**体系，用 `resourcesList` 查、`presignedGetObject` 换下载地址。
见[资源与附件](/zh/meeting/harmony/advanced/resources)。

***

### 相关阅读

* [会控接口](/zh/meeting/harmony/api-reference/admin-actions)
* [资源与附件](/zh/meeting/harmony/advanced/resources)
* [视频渲染](/zh/meeting/harmony/advanced/video-rendering)
