# 录制文件介绍（旧版） (/zh-CN/realtime-media/cloud-recording/build/manage-recorded-files/legacy-introduce-recorded-files)

> For AI agents: see the complete documentation index at [llms.txt](/llms.txt).

本文介绍云端录制生成文件，以帮助你理解录制文件的组成、命名规则、切片规则以及如何估算文件大小。

## 录制文件组成及命名规则 [#录制文件组成及命名规则]

本节具体介绍无异常情况下各录制模式生成的录制文件及命名规则。

### 单流录制模式 [#单流录制模式]

在[单流录制模式](/zh-CN/realtime-media/cloud-recording/reference/concepts#单流录制)下，录制服务会针对不同 UID 的音视频流分别生成对应的音频和视频文件。生成的文件类型可能包括 M3U8、TS 和 WebM 文件。

生成的录制文件命名规则如下：

- M3U8 文件名：`<sid>_<cname>__uid_s_<uid>__uid_e_<type>.m3u8`
- TS 文件名：`<sid>_<cname>__uid_s_<uid>__uid_e_<type>_utc.ts`
- WebM 文件名：`<sid>_<cname>__uid_s_<uid>__uid_e_<type>_utc.webm`（VP8视频编码格式下生成）

### 合流录制模式 [#合流录制模式]

在[合流录制模式](/zh-CN/realtime-media/cloud-recording/reference/concepts#录制模式)下，录制过程中会实时生成一个 M3U8 文件和多个 TS 文件。若在录制配置中将 `avFileType` 设置为 `["hls","mp4"]`，录制服务会同时生成 MP4 文件；若未设置或未包含 `"mp4"`，则仅生成 M3U8/TS，你也可使用[转码脚本](/zh-CN/realtime-media/cloud-recording/build/manage-recorded-files/convert-format)将 M3U8/TS 合并并转换为 MP4 格式。

生成的录制文件命名规则如下：

- M3U8 文件名：`<sid>_<cname>.m3u8`
- TS 文件名：`<sid>_<cname>_<utc>.ts`
- MP4 文件名：`<sid>_<cname>_<index>.mp4`

### 页面录制模式 [#页面录制模式]

在[页面录制模式](/zh-CN/realtime-media/cloud-recording/reference/concepts#录制模式)下，录制过程中会实时生成一个 M3U8 文件和多个 TS 文件。若在录制配置中将 `avFileType` 设置为 `["hls","mp4"]`，录制服务会同时生成 MP4 文件；若未设置或未包含 `"mp4"`，则仅生成 M3U8/TS，你也可使用[转码脚本](/zh-CN/realtime-media/cloud-recording/build/manage-recorded-files/convert-format)将 M3U8/TS 合并并转换为 MP4 格式。

生成的录制文件命名规则如下：

- M3U8 文件名：`<sid>_<cname>.m3u8`
- TS 文件名：`<sid>_<cname>_<timestamp>.ts`
- MP4 文件名：`<sid>_<cname>_<index>.mp4`

### 命名字段说明 [#命名字段说明]

录制生成文件名中主要包含的字段及其含义如下：

| 字段 | 说明 |
| --- | --- |
| `<sid>` | 录制 ID。 |
| `<cname>` | 频道名。由于文件名不支持特殊字符，`cname` 中的特殊字符在生成文件时会被替换成 `-`。特殊字符包括："!"、 "@"、 "#"、 "$"、 "%"、 "^"、 "&"、 "*"、 "("、 ")"、 "+"、 "_"、 "."、 "="、 "["、 "]"、 "&#123;"、 "&#125;"、 "~"、 "&#124;"、 "、"、 ";"、 ":"、 "?"、 "&lt;"、 "&gt;"。 |
| `<uid>` | 用户 ID。 |
| `<type>` | 文件类型，`audio` 或 `video`。 |
| `<utc>` / `<timestamp>` | [introduce-recorded-files-markdown-0-5-1 details](#table-slot-introduce-recorded-files-markdown-0-5-1) |
| `<index>` | MP4 文件的索引数，`0` 表示生成的第一个 MP4 文件。录制服务会在当前 MP4 文件时长超过约 3 小时或大小超过 2 GB 左右时创建一个新的 MP4 文件。 |

<a id="table-slot-introduce-recorded-files-markdown-0-5-1"></a>

**introduce-recorded-files-markdown-0-5-1 details**

切片文件开始录制时的时间标识：

- `<utc>`：用于**单流录制**和**合流录制**场景。采用 UTC 时间（UTC+0），格式：`yyyyMMddHHmmssSSS`。示例：`20190611073246073` 表示 `2019-06-11 07:32:46.073`。
- `<timestamp>`：用于**页面录制**场景，表示该切片开始录制时自 `1970-01-01 00:00:00 UTC` 起经过的毫秒数。示例：`1627613641393` 表示已过 1627613641393 毫秒。

例如，在单流录制文件 `sid713476478245_cnameagora__uid_s_123__uid_e_video_20190920125142485.ts` 中：

- `sid713476478245` 为录制 ID
- `cnameagora` 为频道名
- `123` 为用户 ID
- `video` 为录制类型
- `20190920125142485` 为录制时间（2019 年 9 月 20 日 12 点 51 分 42 秒 485 毫秒）

## 录制文件切片规则 [#录制文件切片规则]

录制文件的切片是将连续的音视频流分割成一系列小文件的过程，这一过程对于视频点播、直播回放以及文件存储和传输至关重要。正确的切片规则能够确保视频内容的连续性、完整性，并适应不同的播放平台和网络条件。以下是对视频和音频文件切片规则的具体介绍：

### 视频文件切片 [#视频文件切片]

当满足以下任一条件时，云端录制即会对视频文件进行切片：

- 切片时长达到 15 秒，并遇到视频关键帧。
- 编码器发生变化。
- 视频宽高发生变化。
- 视频流发生中断。
- 当使用 H.264 编码，单片视频时长超过 5.5 分钟，或单个文件大小超过 50 M，云端录制会强制切片。强制切片后，新切片的首帧可能非 I 帧，导致该切片文件不能直接解码播放。例如在通信模式下，数小时内可能仅出现一个 I 帧，容易出现新切片的首帧非 I 帧。

:::caution[注意]
当在 Web 端使用 VP8 编码时，云端录制不会强制切片。
:::

### 音频文件切片 [#音频文件切片]

当切片时长达到 15 秒，云端录制会对音频文件进行切片。

## 估算录制文件大小 [#估算录制文件大小]

本节介绍如何估算录制文件大小。

单流模式下，录制文件大小主要与音视频源的码率和录制时长相关。例如，当音频码率为 48 Kbps，视频码率为 500 Kbps，录制文件时长为 30 分钟时，该录制文件的大小约为 (48 Kbps + 500 Kbps) × 60 s/min × 30 min = 986.4 Mbit，即 123.3 MB。

合流模式下，录制文件大小主要与转码设置中的码率和录制时长相关，如果你未进行转码设置，则使用默认值。例如，当你在 `start` 方法中设置 `audioProfile` 为 `1` (音频码率 128 Kbps)，设置 `bitrate` （视频码率）为 800，录制文件时长为 30 分钟时，该文件的大小约为 (128 Kbps + 800 Kbps) × 60 s/min × 30 min = 1670.4 Mbit，即 208.8 MB。

## 参考信息 [#参考信息]

### 异常情况下的录制文件名 [#异常情况下的录制文件名]

#### 上传云存储失败 [#上传云存储失败]

如果录制文件上传到你指定的云存储失败，云端录制会将文件通过备份云转存至你指定的云存储。为确保不覆盖最新版本，M3U8 文件名会附上后缀 `_<tick>_<index>`。

- `tick`：与该 M3U8 文件生成时的时间相关。
- `index`：该 M3U8 文件的索引数。`0` 表示第一次更新。`index` 越大，M3U8 文件的版本越新。

以文件名 `sid713476478245_cnameagora__uid_s_123__uid_e_video_22194679897_3.m3u8` 为例，`3` 为该 M3U8 文件的索引数，表示该文件为第四次更新后的 M3U8 文件。

:::info[信息]
当云存储中存在带有 `_<tick>_<index>` 后缀的 M3U8 文件，你需要将 `index` 最大的 M3U8 文件与无后缀的 M3U8 文件对比，选择内容较多的一个，作为最终使用的 M3U8 文件。通过备份云转存的 TS/WebM 文件以及 MP4 文件的文件名不会附上该后缀。
:::

#### 服务器断网或进程被杀 [#服务器断网或进程被杀]

当出现[服务器断网、进程被杀](/zh-CN/reference/faq/integration/high_availability)时，云端录制会自动启用高可用机制，在 90 秒内切换到新的服务器，自动恢复录制服务。启用高可用机制后，会生成新的 M3U8 文件，包含录制服务恢复之后的切片文件索引信息。文件名增加 `bak<n>` 前缀，`n` 为高可用机制在该次录制中被启用的 `index`, `0` 表示第一次启用。

以文件名 `bak0_sid713476478245_cnameagora.m3u8` 为例，`bak0` 表示该文件为本次录制中第一次启用高可用机制后生成的 M3U8 文件。

启用高可用机制后，录制生成的 TS/WebM 文件以及 MP4 文件的文件名也会增加 `bak<n>` 前缀。

如需将原 M3U8 文件与启用高可用机制后生成的新 M3U8 文件合并为一个 MP4 文件，请参考[转换录制文件格式](/zh-CN/realtime-media/cloud-recording/build/manage-recorded-files/convert-format)。

### M3U8 切片文件 [#m3u8-切片文件]

#### 命名字段说明 [#命名字段说明-1]

M3U8 文件包含多个切片文件的文件名及其描述符。声网云端录制产生的 M3U8 文件中用到的描述符有三种：

- `#EXT-X-AGORA-TRACK-EVENT:EVENT=<event>,TRACK_TYPE=<type>,TIME=<utc>`：音视频流开始或者中断后重新开始的第一个切片文件会附带这一描述符，描述流状态的变化。
  - `EVENT`: 事件名称，目前只能为 `START`，表示音视频开始或中断后重新开始
  - `TRACK_TYPE`：切片文件内容，`AUDIO` 或 `VIDEO`
  - `TIME`: 流状态变化的时间。UTC 时间，时区为 UTC+0

- `#EXT-X-AGORA-ROTATE:WIDTH=<width>,HEIGHT=<height>,ROTATE=<rotate>,TIME=<utc>`：视频旋转后第一个切片文件会附带这一描述符，描述视频旋转的信息。一个切片文件可能附带多个视频旋转的描述符。
  - `WIDTH`：视频宽度
  - `HEIGHT`：视频高度
  - `ROTATE`：视频逆时针旋转的角度，只能为 `0`、`90`、`180` 或 `270`
  - `TIME`：视频发生旋转的时间。UTC 时间，时区为 UTC+0。
- `#EXTINF:<length>`：描述切片文件的时长，单位为秒。

例如：

```shell
#EXT-X-AGORA-ROTATE:WIDTH=640,HEIGHT=480,ROTATE=90,TIME=20190920125142485
#EXT-X-AGORA-TRACK-EVENT:EVENT=START,TRACK_TYPE=VIDEO,TIME=20190920125142485
#EXTINF:6.332000
sid713476478245_cnameagora__uid_s_123__uid_e_video_20190920125142485.ts
```

:::info[信息]
如果某些播放器因 `#EXTINF:<length>` 后没有逗号而出现兼容性问题，你可以在 `start` 请求中的 `recordingConfig` 字段中配置字段 `privateParams`，即 `"recordingConfig": {"privateParams":"{\"correctEXTINF\":true}", ...}`。
:::

#### 音频 M3U8 文件示例 [#音频-m3u8-文件示例]

```shell
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:18
#EXT-X-DISCONTINUITY
#EXT-X-AGORA-TRACK-EVENT:EVENT=START,TRACK_TYPE=AUDIO,TIME=20190920125142289
#EXTINF:15.019000
sid713476478245_cnameagora__uid_s_123__uid_e_audio_20190920125142289.ts
#EXTINF:15.019000
sid713476478245_cnameagora__uid_s_123__uid_e_audio_20190920125157307.ts
#EXTINF:15.019000
sid713476478245_cnameagora__uid_s_123__uid_e_audio_20190920125212326.ts
#EXTINF:15.019000
sid713476478245_cnameagora__uid_s_123__uid_e_audio_20190920125227345.ts
#EXTINF:12.523000
sid713476478245_cnameagora__uid_s_123__uid_e_audio_20190920125242363.ts
#EXT-X-ENDLIST
```

#### 视频 M3U8 文件示例 [#视频-m3u8-文件示例]

```shell
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:34
#EXT-X-DISCONTINUITY
#EXT-X-AGORA-ROTATE:WIDTH=640,HEIGHT=480,ROTATE=0,TIME=20190920125142485
#EXT-X-AGORA-TRACK-EVENT:EVENT=START,TRACK_TYPE=VIDEO,TIME=20190920125142485
#EXTINF:6.332000
sid713476478245_cnameagora__uid_s_123__uid_e_video_20190920125142485.ts
#EXT-X-AGORA-ROTATE:WIDTH=1280,HEIGHT=720,ROTATE=0,TIME=20190920125149174
#EXT-X-DISCONTINUITY
#EXTINF:17.442000
sid713476478245_cnameagora__uid_s_123__uid_e_video_20190920125149174.ts
#EXT-X-DISCONTINUITY
#EXT-X-AGORA-ROTATE:WIDTH=640,HEIGHT=480,ROTATE=0,TIME=20190920125206616
#EXTINF:33.326000
sid713476478245_cnameagora__uid_s_123__uid_e_video_20190920125206616.ts
#EXT-X-DISCONTINUITY
#EXT-X-AGORA-ROTATE:WIDTH=1280,HEIGHT=720,ROTATE=0,TIME=20190920125239942
#EXTINF:14.815000
sid713476478245_cnameagora__uid_s_123__uid_e_video_20190920125239942.ts
#EXT-X-ENDLIST
```
