# 录制崩溃后修复录制文件 (/zh-CN/realtime-media/local-server-recording/build/legacy/restore-files)

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

在过去的版本中，由于录制崩溃，录制生成的 MP4 文件可能无法播放。

针对该问题，自 3.0.3 版本起，声网录制 SDK 提供如下解决方案：

- 录制 SDK 在录制过程中生成 TS 格式的视频文件，并在录制正常结束后自动转封装为 MP4 文件。即使录制过程中偶现崩溃，最终生成的 MP4 文件依然可以播放。
- 录制 SDK 新增 `crash_restore.sh` 脚本。当录制服务因多次崩溃而异常退出时，你可以运行该脚本将 TS 文件转封装为 MP4 文件，并修复内容缺失的 `uid_UID_timestamp.txt` 文件。

## 适用场景 [#适用场景]

声网录制 SDK 会在以下场景的录制过程中生成 TS 文件：

| 录制模式 | 录制内容 | 参数设置 | 录制过程中生成的文件 | 录制完成后生成的文件 |
| --- | --- | --- | --- | --- |
| [单流录制](/zh-CN/realtime-media/local-server-recording/build/legacy/individual-mode) | 同时录制音视频 | 默认设置 | [restore-files-html-0-1-3 details](#table-slot-restore-files-html-0-1-3) | [restore-files-html-0-1-4 details](#table-slot-restore-files-html-0-1-4) |
| [合流录制](/zh-CN/realtime-media/local-server-recording/build/legacy/composite-mode) | 仅录制视频 | [restore-files-html-0-2-2 details](#table-slot-restore-files-html-0-2-2) | 一个 TS 视频文件 | 一个 MP4 视频文件 |
| [合流录制](/zh-CN/realtime-media/local-server-recording/build/legacy/composite-mode) | 同时录制音视频 | [restore-files-html-0-3-2 details](#table-slot-restore-files-html-0-3-2) | 一个 TS 音视频文件 | 一个 MP4 音视频文件 |

<a id="table-slot-restore-files-html-0-1-3"></a>

**restore-files-html-0-1-3 details**

- Native 和框架端每个 UID 生成一个 AAC 音频文件和一个 TS 视频文件
- Web 端每个 UID 生成一个 AAC 音频文件和一个 WebM 或 TS 视频文件

<a id="table-slot-restore-files-html-0-1-4"></a>

**restore-files-html-0-1-4 details**

- Native 和框架端每个 UID 生成一个 AAC 音频文件和一个 MP4 视频文件
- Web 端每个 UID 生成一个 AAC 音频文件和一个 WebM 或 MP4 视频文件

<a id="table-slot-restore-files-html-0-2-2"></a>

**restore-files-html-0-2-2 details**

- `--isVideoOnly 1`
- `--isMixingEnabled 1`

<a id="table-slot-restore-files-html-0-3-2"></a>

**restore-files-html-0-3-2 details**

- `--isMixingEnabled 1`
- `--mixedVideoAudio 2`

:::info[信息]
- AAC 音频文件和 WebM 视频文件为流媒体格式的文件，即使录制崩溃也不会影响其可用性。
- 表格中列出的是在录制过程中无崩溃情况下，录制过程中和录制完成后生成的文件。如果录制过程中发生崩溃，TS 视频文件会根据崩溃的次数而被切分成多个，转封装后的 MP4 文件也将是多个。
:::

## 实现方法 [#实现方法]

在不同录制模式下，根据单次录制进程中录制崩溃发生的次数，你需要对录制文件进行不同的修复操作，具体如下表所示：

| 崩溃次数 | 单流录制 | 合流录制 |
| --- | --- | --- |
| 崩溃小于 4 次 | [restore-files-html-1-1-1 details](#table-slot-restore-files-html-1-1-1) | [restore-files-html-1-1-2 details](#table-slot-restore-files-html-1-1-2) |
| 崩溃等于 4 次 | [restore-files-html-1-2-1 details](#table-slot-restore-files-html-1-2-1) | [restore-files-html-1-2-2 details](#table-slot-restore-files-html-1-2-2) |

<a id="table-slot-restore-files-html-1-1-1"></a>

**restore-files-html-1-1-1 details**

- 录制服务会被重复拉起，继续录制。由于录制崩溃，TS 文件会被切片，`uid_UID_timestamp.txt` 文件会出现内容缺失。
- 录制结束后，录制 SDK 会将所有 TS 文件逐一转封装为 MP4 文件，无需手动处理。
- 但是，录制 SDK 不会修复 `uid_UID_timestamp.txt` 文件。如果你需要用转码脚本将每个 UID 的音频文件和视频文件合并成一个 MP4 文件，则需要先运行 `crash_restore.sh` 脚本修复 `uid_UID_timestamp.txt` 文件。

<a id="table-slot-restore-files-html-1-1-2"></a>

**restore-files-html-1-1-2 details**

- 录制服务会被重复拉起，继续录制。由于录制崩溃，TS 文件会被切片。
- 录制结束后，录制 SDK 会将所有 TS 文件逐一转封装为 MP4 文件，无需手动处理。

<a id="table-slot-restore-files-html-1-2-1"></a>

**restore-files-html-1-2-1 details**

- 录制服务异常退出，因录制崩溃而被切片的 TS 文件无法被自动转封装，`uid_UID_timestamp.txt` 文件会出现内容缺失。
- 你需要运行 `crash_restore.sh` 脚本将所有 TS 文件转封装为 MP4 文件。该脚本同时会修复 `uid_UID_timestamp.txt` 文件。

<a id="table-slot-restore-files-html-1-2-2"></a>

**restore-files-html-1-2-2 details**

- 录制服务异常退出，因录制崩溃而被切片的 TS 文件无法被自动转封装。
- 你需要运行 `crash_restore.sh` 脚本将所有 TS 文件转封装为 MP4 文件。

## 使用恢复脚本 [#使用恢复脚本]

### 前提条件 [#前提条件]

开始前请确保你的开发环境满足以下要求：

- Linux 运行环境
- Python 3.0 或以上版本
- FFmpeg 4.0 或以上版本 （你也可以使用声网录制 SDK 在 **tools** 文件夹下提供的 FFmpeg 包。）
- 确保录制文件的存储路径可访问。

### 恢复步骤 [#恢复步骤]

输入以下命令行：

```shell
$ ./crash_restore.sh <recorderDir>/
```

其中，`recorderDir` 为录制文件存放的目录。

输入命令行后，脚本会将指定目录下所有 TS 文件逐一转封装为 MP4 文件，并对 `uid_UID_timestamp.txt` 文件做修复处理。

转封装后的 MP4 文件的数量和主名与源 TS 文件一致，后缀名为 `mp4`。使用脚本完成转封装后，TS 文件不会被删除，以免因修复异常而需要再次使用。

## 示例 [#示例]

如要将录制文件夹 `20200915` 下的 TS 文件转封装为 MP4 文件并修复 `uid_UID_timestamp.txt` 文件，命令如下：

```shell
$ ./crash_restore.sh 20200915/
```

修复前：

<DocsImage alt="修复前" src="https://web-cdn.agora.io/docs-files/1600314197717" displayWidth="50%" />

修复后：

<DocsImage alt="修复后" src="https://web-cdn.agora.io/docs-files/1600314313477" displayWidth="50%" />

## 注意事项 [#注意事项]

开发过程中，你还需要关注以下注意事项：

- 自 3.0.3 版本起，录制结束后，需要等待转封装完成，才能得到 MP4 文件。转封装实际耗时取决于服务器的 IOPS 以及待转封装的所有 TS 文件大小。例如，转封装大小总和为 4GB 的 TS 文件大约需要 85 到 150 秒（该数据仅供参考）。
- 转封装操作会增加服务器磁盘 IO 资源消耗。如果服务器磁盘性能较差，在转封装完成前，建议不要进行其他操作。
