实时音视频 实现云端切片

在远程教育、秀场直播、视频会议、远程定损、金融双录、在线医疗等应用场景中,考虑取证、质检、审核、存档和回放等需求,常需要将整个视频通话或互动直播过程通过云端切片存储下来的情况。

相关产品
实时音视频 产品页,含版本规格、价格与购买入口。

二、云端切片费用

通过 TRTC 发起的云端审核,TRTC 仅向你收取音频切片和视频截图的费用,音频切片和视频截图的费用详情请参见 音频切片和视频截图计费说明。

三、功能说明

通过 TRTC 的云端切片功能,你可以将房间中每一个用户的音视频流进行云端音频切片或者视频截图处理,无需客户端接入。

四、名词解释

音频切片:将房间内的某一个用户的音频流按照一定的时间间隔进行切片处理,切片后为音频片段。

视频截图:将房间内的某一个用户的视频流按照一定的时间间隔进行截图处理,截图后为图片。

文件存储:支持将云端切片后的文件存储到对象存储 COS、AWS S3、阿里云 OSS。

回调通知:我们支持回调通知的能力,通过配置你的回调域名,云端切片的事件状态会通知到你的回调服务器。

五、音频切片及视频截图流程

如下所示,房间里面主播1和主播2都上行了音视频流,假设你通过机器人订阅了主播1和主播2的音视频流,并设置同时进行视频截图和音频切片,后台会分别拉取主播1和主播2的音视频流,把音视频流切片成多个独立的音频文件和视频截图文件:

·主播1的多个音频切片文件。

·主播1的多个视频截图文件。

·主播2的多个音频切片文件。

·主播2的多个视频截图文件。

后台会把这些文件上传到你指定的云存储平台(对象存储 COS,AWS S3或者阿里云 OSS)。具体切片流程如下:

六、API 接口和切片并发限制

·切片接口的调用频率限制为20 qps(如需提高 QPS 请 提交工单)。

·单个接口超时时间为6秒。

·单个应用下默认并发切片支持500路(API 切片任务的总和),超过并发限制的任务会失败,如需更多并发路数,请 提交工单 联系我们。

·单次切片任务最大支持同时订阅的房间内主播数为25个,主播只上行音频也会单独占据一路。

八、启动切片任务(CreateCloudSlice)

通过你的后台服务调用 REST API (CreateCloudSlice)来启动云端切片,需要重点关注参数——任务 ID(TaskId);这个参数是本次切片任务的唯一标识,你需要保存下这个任务 ID 作为后续针对这个切片任务接口操作的输入参数。

1. 发起任务(CreateCloudSlice)

发起云端切片任务的接口 CreateCloudSlice 中需要你指定分配切片机器人的进房参数 UserId 和 UserSig(如何获取 UserSig),请不要与你房间内的正常主播或观众使用的 UserId 重复且不可与正在切片中的房间内指定的切片机器人 UserId 一致,否则会导致切片任务失败。

2. 指定切片用户(SubscribeStreamUserIds)

你也可以通过参数 SubscribeStreamUserIds 指定想要切片或者不想切片的主播用户的黑白名单信息,当然我们也支持在切片的过程中进行更新操作。

3. 指定存储位置(SliceStorageParams)

3.1 存储位置:支持存储至 AWS S3 或对象存储 COS,请通过在 SliceStorageParams 参数指定存储参数。

3.2 切片格式:图片切片文件为 png, 音频切片文件为 ogg。

九、查询切片任务状态 (DescribeCloudSlice)

如果需要,你可以调用该接口查询切片服务的状态。

十、修改切片任务参数(ModifyCloudSlice)

如果需要,你可以调用该接口修改切片服务的参数,例如修改指定切片用户(SubscribeStreamUserIds)。

十一、停止切片任务 (DeleteCloudSliceTask)

成功开启切片任务后,可以使用此接口来停止任务。

十三、切片文件命名说明

音频切片默认命名为:

{你的桶名称}/{taskId}/{userId}/audios/{sdkappid}_{roomId}_{userid}_{UTC时间}.ogg

视频截图文件默认命名为:

{你的桶名称}/{taskId}/{userId}/images/{sdkappid}_{roomId}_{userid}_{UTC时间}.png

字段含义说明:

字段 含义
<taskId> 切片的任务 ID 。
<sdkappid> 切片任务的 SdkAppId。
<roomId> 切片的房间号。
<userid> 切片的用户 ID。
<UTC时间> 当前时间字符串 例如:20250106143143。

十四、查找切片文件

登录 对象存储 COS 控制台,选择你指定的存储桶 Bucket 进行查找:

音频切片路径:{你的桶名称}/{taskId}/{userId}/audios/

视频截图路径:{你的桶名称}/{taskId}/{userId}/images/

十五、切片回调事件

我们针对云端切片功能提供了多种的回调事件,帮助你及时了解切片任务的处理和完成情况。

十六、切片回调地址配置

实时音视频 TRTC 控制台支持自助配置回调信息,配置完成后即可接收事件回调通知。详细操作指引请参见 回调配置。

十七、回调接口

你可以提供一个接收回调的 HTTP/HTTPS 服务网关来订阅回调消息。当相关事件发生时,云切片系统会回调事件通知到你的消息接收服务器。

十八、事件回调消息格式

事件回调消息以 HTTP/HTTPS POST 请求发送给你的服务器,其中:

字符编码格式:UTF-8。

请求:body 格式为 JSON。

应答:HTTP STATUS CODE = 200,服务端忽略应答包具体内容,为了协议友好,建议客户应答内容携带 JSON: {"code":0}。

20、参数说明

事件回调消息的 header 中包含以下字段:

字段名 值
Content-Type application/json
Sign 签名值
SdkAppId SDK 应用 ID 值

21、事件回调消息的 body 中包含以下字段:

字段名 类型 含义
EventGroupId Number 事件组 ID, 云端切片固定为10。
EventType Number 回调通知的事件类型。
CallbackTs Number 事件回调服务器向你的服务器发出回调请求的 Unix 时间戳,单位为毫秒。
EventInfo JSON Object 事件信息。

22、事件类型说明:

字段名 类型 含义
EVENT_TYPE_CLOUD_SLICE_START 1001 云端切片模块启动。
EVENT_TYPE_CLOUD_SLICE_STOP 1002 云端切片模块退出。
EVENT_TYPE_CLOUD_SLICE_UPLOAD_START 1003 云端切片文件上传任务启动,仅在选择对象存储时回调。
EVENT_TYPE_CLOUD_SLICE_FILE_INFO 1004 云端切片生成视频截图或者音频分片文件,上传成功后回调,仅在选择对象存储时回调。
EVENT_TYPE_CLOUD_SLICE_UPLOAD_STOP 1005 云端切片文件上传结束,仅在选择对象存储时回调。
EVENT_TYPE_CLOUD_SLICE_UPLOAD_ERROR 1006 云端切片投递模块发生错误。

23、事件信息说明:

字段名 类型 含义
RoomId String/Number 房间名(类型与客户端房间号类型一致)。
EventTs Number 事件发生的 Unix 时间戳,单位为秒 (不建议使用该字段,建议使用 EventMsTs)。
EventMsTs Number 事件发生的 Unix 时间戳,单位为毫秒。
UserId String 切片机器人的用户 ID。
TaskId String 切片任务 ID,一次云端切片任务唯一的 ID。
Payload JsonObject 根据不同事件类型定义不同。

事件类型为1001 (EVENT_TYPE_CLOUD_SLICE_START) 时 Payload 的定义:

字段名 类型 含义
Status Number 0:代表切片模块启动成功。1:代表切片模块启动失败。

{ "EventGroupId": 10, "EventType": 1001, "CallbackTs": 1726125338219, "EventInfo": { "RoomId": "960025", "EventTs": 1726125338, "EventMsTs": 1726125338219, "UserId": "inspect", "TaskId": "-npVqpdU7sBobiK1iskE3BwlLIebCMrbKUbnL4K-rO+8oZWQndib9uvO4Deq9P1Na+sXGNGNuAE." "Payload": { "Status": 0 } }}

事件类型为1002 (EVENT_TYPE_CLOUD_SLICE_STOP) 时 Payload 的定义:

字段名 类型 含义
LeaveCode Number 0:代表切片模块正常调用停止切片退出。1:切片机器人被客户踢出房间。2:客户解散房间。3:服务器将切片机器人踢出。4:服务器解散房间。99:代表房间内除了切片机器人没有其他用户流,超过指定时间退出。100:房间超时退出。101:同一用户重复进入相同房间导致机器人退出。

{ "EventGroupId": 10, "EventType": 1002, "CallbackTs": 1729601782073, "EventInfo": { "RoomId": "975626", "EventTs": "1729601782", "EventMsTs": 1729601782073, "UserId": "SliceTaskDuration1-partner-robot", "TaskId": "-nHRjqhU7gTG0UIL-MquzG8D0Q+wehTbVTeeIIK-rO+8oZWQndibtueIpQ8A0F3n9PEVRk0rngE.", "Payload": { "LeaveCode": 99 } }}

事件类型为1003 (EVENT_TYPE_CLOUD_SLICE_UPLOAD_START) 时 Payload 的定义:

字段名 类型 含义
Status Number 0:代表上传模块正常启动。1:代表上传模块初始化失败。

{ "EventGroupId": 10, "EventType": 1003, "CallbackTs": 1726750023538, "EventInfo": { "RoomId": "295210", "EventTs": 1726750023, "EventMsTs": 1726750023538, "UserId": "inspect", "TaskId": "-nHwXIdU7mJvL22pFsXZ-v7OgEzq1OzbNXe9L4K-4pycoZWQndib3ZfzqN7Wq+AdiPLMBLxd0gE.", "Payload": { "Status": 0 } }}

事件类型为1004 (EVENT_TYPE_CLOUD_SLICE_FILE_INFO )时 Payload 的定义:

字段名 类型 含义
Payload 对象 切片结果。
StreamUserId String 当前主播 ID。

{ "EventGroupId": 10, "EventType": 1004, "CallbackTs": 1726750309161, "EventInfo": { "RoomId": "963600", "EventTs": 1730186326, "EventMsTs": 1730186326109, "UserId": "SliceCustomUploadCase6-partner-robot", "StreamerUserId": "SliceCustomUploadCase6-user0", "TaskId": "-nHRjqhU7kGRgNhGI8Gq8JkT7wnFeUXbXG-6IYK-yb3t8ZWQndibhWMUwNxQwRlgnWuvEuBSqAE.", "Payload": { "FileList": "20012177_2428_1929088_20250106143143.png" } }}

事件类型为1005 (EVENT_TYPE_CLOUD_SLICE_UPLOAD_STOP) 时 Payload 的定义:

字段名 类型 含义
Status Number 结束送审。

{ "EventGroupId": 10, "EventType": 1005, "CallbackTs": 1726751347072, "EventInfo": { "RoomId": "295211", "EventTs": 1726751347, "EventMsTs": 1726751347072, "UserId": "inspect", "TaskId": "-nHwXIdU7jx6C00Nt8Vr+3h4GwYdP7zbeHi9L4K-4pycoZWQndibqFeEaV4LvjFqSuQvaAkrNQE.", "Payload": { "Status": 0 } }}

事件类型为1006 (EVENT_TYPE_CLOUD_SLICE_UPLOAD_ERROR) 时 Payload 的定义:

字段名 类型 含义
Code Number COS 或者第三方存储错误码。
Message String COS 或者第三方存储错误消息。

{ "EventGroupId": 10, "EventType": 1006, "CallbackTs": 1726751347072, "EventInfo": { "RoomId": "295211", "EventTs": 1726751347, "EventMsTs": 1726751347072, "UserId": "inspect", "TaskId": "-nHwXIdU7jx6C00Nt8Vr+3h4GwYdP7zbeHi9L4K-4pycoZWQndibqFeEaV4LvjFqSuQvaAkrNQE.", "Payload": { "Code": 10002, "Message": "BadRequest" } }}

赞 (0)
上一篇 4天前
下一篇 4天前