实现单流录制
云端录制支持单流录制、合流录制和页面录制三种模式,其中单流录制模式指分别录制频道中每个用户 ID 的音频流和视频流,录制结束后每个用户 ID 会生成对应的音频文件和视频文件。
本文介绍如何使用云端录制的 RESTful API 并设置核心字段,进行单流录制并生成特定格式的文件。
本文内容适用于新单流录制。旧版单流录制文档请参阅旧版实现单流录制。
前提条件
开始前,请参考使用 RESTful API 开始云端录制进行一次完整的录制流程体验。
实现步骤
本节介绍如何在申请录制服务器资源后,实现单流音视频录制。
开始录制
调用 start 方法开始云端录制。
请求示例
以下介绍开始单流音视频录制请求的关键配置,确保你进行正确设置以实现预期的录制效果。
-
在调用
start方法时,将mode参数设置为raw,开启单流录制模式。注意录制模式的设置必须在开始录制的时候完成,不支持在录制开始后切换模式。
-
设置
recordingConfig和recordingFileConfig中的参数。不同streamTypes与recordingFileConfig.avFileType配置组合对应的录制文件生成关系如下。具体设置参见streamTypes参数说明。
- streamTypes = 0
- streamTypes = 1
- streamTypes = 2
| 录制内容 | `recordingFileConfig.avFileType` 设置 | 最终输出效果 |
|---|---|---|
| 仅录制音频 | ["hls"] | 每个用户 ID 生成一个 HLS 文件,仅包含该用户的音频数据。 |
| 仅录制音频 | ["hls", "mp3"] | 同时生成 2 份文件: - 每个用户 ID 生成一个 HLS 文件,仅包含该用户的音频数据。 - 每个用户 ID 生成一个 MP3 文件。 |
| 仅录制音频 | ["mp3"] | 不支持。 |
| 录制内容 | `recordingFileConfig.avFileType` 设置 | 最终输出效果 |
|---|---|---|
| 仅录制视频 | ["hls"] | 每个用户 ID 生成一个 HLS 文件或 DASH 文件(取决于源流视频编码器),每个切片内仅包含该用户的视频数据。 |
| 仅录制视频 | ["hls", "mp4"] | 同时生成 2 份文件: 1. 每个用户 ID 生成一个 HLS 文件或 DASH 文件(取决于源流视频编码器),每个切片内仅包含该用户的视频数据。 2. 每个用户 ID 生成一个 MP4 文件。该功能有一些已知限制,详见单流直接生成 MP4。 |
| 仅录制视频 | ["mp4"] | 不支持。 |
| 录制内容 | `recordingFileConfig.avFileType` 设置 | 最终输出效果 |
|---|---|---|
| 同时录制音视频 | ["hls"] | 每个用户 ID 生成一个 HLS 文件或 DASH 文件(取决于源流视频编码器),每个切片内同时包含该用户的音频及视频数据。 |
| 同时录制音视频 | ["hls", "mp4"] | 同时生成 2 份文件: 1. 每个用户 ID 生成一个 HLS 文件或 DASH 文件(取决于源流视频编码器),每个切片内同时包含该用户的音频及视频数据。 2. 每个用户 ID 生成一个 MP4 文件。该功能有一些已知限制,详见单流直接生成 MP4。 |
| 同时录制音视频 | ["mp4"] | 不支持。 |
- HLS 文件表示一个 M3U8 文件及多个 TS 文件,属于标准 HLS 协议,可直接播放。
- DASH 文件表示一个 MPD 文件及多个 WebM 文件,属于标准 DASH 协议,可直接播放。
如需了解录制文件的命名规则、字段含义和切片规则,请参见录制文件介绍。
- 参照快速开始配置
storageConfig相关参数。
单流音视频录制的请求 Body 示例如下:
curl --location --request POST 'https://api.sd-rtn.com/v1/apps/<your_app_id>/cloud_recording/resourceid/<resourceid>/mode/raw/start' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: <http_basic_auth>' \
--data '{
"cname": "show",
"uid": "123",
"clientRequest": {
"token": "<your_token>",
"recordingConfig": {
"channelType": 1,
"streamTypes": 2,
"videoStreamType": 0,
"maxIdleTime": 30,
"subscribeAudioUids": [
"123",
"456"
],
"subscribeVideoUids": [
"123",
"456"
],
"subscribeUidGroup": 0
},
"recordingFileConfig": {
"avFileType": [
"hls",
"mp4"
]
},
"storageConfig": {
"vendor": 2,
"region": 3,
"bucket": "<your_storage_bucket_name>",
"accessKey": "<your_storage_access_key>",
"secretKey": "<your_storage_secret_key>",
"fileNamePrefix": [
"quickstart",
]
},
}
}
单流直接生成 MP4
单流录制模式下,视频不做编解码。若想直接生成可播放的 MP4 文件,且尽量减少 MP4 切片数量,需要满足以下条件:
- 源流视频编码器必须是 H.264、H.265 或 AV1。若源流是 VP8 或 VP9,则不支持直接生成 MP4。
- 源流分辨率保持不变。
具体设置如下:
- Native 端
- Web 端
调用 SetVideoEncodeConfiguration,将参数 orientationMode 设置为 1 或 2,固定为横屏或竖屏。
调用 SetVideoEncodeConfiguration,将参数 DEGRADATION_PREFERENCE 设置为 3 或 100,保持分辨率不变或关闭 VQC。
调用 setOptimizationMode API,将 OptimizationMode 设置为 detail,即清晰度优先,弱网情况下优先降低帧率,不降低分辨率。
若主播源流无法满足上述要求,录制过程中分辨率发生变化,变化前后将生成不同的 MP4 切片文件,具体文件名可参考录制文件组成及命名规则。
如果无法保证主播源流分辨率固定,也不接受生成多段 MP4 文件,或者主播源流是 VP8/VP9 编码,则可使用合流录制,在录制过程中实时转码,以最大限度保证 MP4 文件兼容性。
响应示例
{
"cname": "show",
"uid": "123",
"resourceId": "SGXETXXX",
"sid": "04a85XXX"
}
你需要复制 sid 以备后用。
停止录制
录制完成后,调用 stop 方法离开频道,停止录制。录制停止后如需再次录制,必须再调用 acquire 方法请求一个新的 Resource ID。
请求示例
curl --location --request POST 'https://api.sd-rtn.com/v1/apps/<yourappid>/cloud_recording/resourceid/<resourceid>/sid/<sid>/mode/raw/stop' \
--header 'Content-Type: application/json' \
--data '{
"cname": "show",
"uid": "123",
"clientRequest": {
"async_stop": false
}
}'
响应示例
{
"resourceId": "SGXETXXX",
"sid": "04a85XXX",
"serverResponse": {
"fileListMode": "json",
"fileList": [
{
"fileName": "xxxxxxx",
"isPlayable": true,
"mixedAllUser": false,
"sliceStartTime": xxxxxxxxxx,
"trackType": "audio_and_video",
"uid": "xxx"
}
],
"uploadingStatus": "uploaded"
},
"cname": "show",
"uid": "123"
}
uploadingStatus 字段表示录制文件上传状态:
uploaded:录制文件已上传至第三方云存储。stranded:v2 新增状态。业务逻辑需要针对该状态补充分支处理,并结合消息通知或查询结果处理未完成的文件上传。
开发注意事项
在进行单流录制过程中,你需要关注如下注意事项:
-
如果在录制过程中禁用视频轨道,则录制效果详见下表:
发流端类型 禁用视频轨道的方法 录制效果 Native 端 调用 muteLocalVideoStream或disableVideo方法不继续生成视频切片文件,在本切片内用户画面显示最后一帧。 Web 端 调用 setEnabled方法不继续生成视频切片文件,在本切片内用户画面显示最后一帧。
相关文档
在单流录制过程中,你还可以参考如下文档:
API 参考
你可以参考以下方法了解字段详情: