功能说明
针对在同一房间内同时需要录制和转推主播的音视频流的情况,TRTC 推出了一项全新解决方案。该方案支持通过一次接口调用,将房间内主播的音视频流同时进行录制存储和转推 CDN。另外对于需要混流录制和混流转推 CDN 的场景,用户只需完成一次混流任务,与分别发起混流录制和混流转推功能相比,只需一次接口调用并可节省一次混流的成本。
录制文件命名和文件切分说明
录制 MP4/AAC 文件名命名规则
单流录制 MP4/AAC 文件名规则:
<SdkAppId>_<RoomId>_UserId_s_<UserId>_UserId_e_<MediaId>_<Index>.mp4/aac
混流录制 MP4/AAC 文件名规则:
<SdkAppId>_<RoomId>_<Index>.mp4/aac
录制 HLS 文件名命名规则
单流录制 HLS 文件名规则:
<SdkAppId>_<RoomId>_UserId_s_<UserId>_UserId_e_<MediaId>_<Type>.m3u8
混流录制 HLS 文件名规则:
<SdkAppId>_<RoomId>.m3u8
字段含义说明:
字段 | 含义 |
<SdkAppId> | 录制任务的 SdkAppId |
<RoomId> | 录制的房间号,如果这里 RoomId 如果是字符串房间号,我们会对房间号先做 base64 操作,再把 base64 后的字符串中符号'/'替换成 '-' (中划线),符号'='替换成 '.' |
<UserId> | 录制的用户 ID,UserId 会先做 base64 操作,再把base64后的字符串中符号'/'替换成 '-' (中划线),符号'='替换成 '.' |
<MediaId> | 主辅流标识,main 代表主流(摄像头),aux 代表辅流(屏幕分享) |
<Index> | 如果没有触发切片逻辑(大小超过2GB或超过设置的切片时长)则无该字段,否则为切片的索引号,从1开始递增 |
<Type> | 录制文件流类型,audio/video/audiovideo |
说明:
自定义设置文件名称前缀:使用 API 录制 存储至云点播 VOD 时,可通过 TencentVod 中的 UserDefineRecordId 参数自定义文件名称前缀,前缀与默认录制文件名之间用 "__UserDefine_u_" 分隔。
录制文件切分说明
录制 MP4/ACC 文件切分的条件:
录制切分时长可设置范围1 - 1440分钟,默认1440分钟。
单个 MP4/AAC 文件大小达到2GB。
录制 HLS 文件切分的条件:
录制任务持续时间超过14天时,HLS 文件将会被切分。
录制上传云存储说明
录制后台会在录制结束后将录制的文件通过您指定的方式上传到云存储平台(云点播 VOD 或对象存储 COS),并通过回调的形式把播放地址发送给您。如果录制模式为单流录制模式,每一个订阅的主播都会有一个对应的播放地址;如果发起混流录制,只有一个混合后媒体的播放地址。
通过 API 发起录制:在 McuRecordParams 中必须指定 McuStorageParams 的参数(云点播 VOD 或对象存储 COS),请确保已经开通对应的云存储服务且未欠费。
注意:
文件录制后会上传至您指定云存储平台(云点播 VOD 或对象存储 COS),为确保录制文件成功,请确保您指定的云点播 VOD 或对象存储 COS 服务可用。
API 接口和录制并发限制
接口的调用频率限制为20qps(如需提高 QPS 请 提交工单)。
单个接口超时时间为6秒。
单次录制任务最大支持同时订阅的房间内主播数为25个,主播只上行音频也会单独占据一路。
使用说明
目前支持通过 Restful API 接口:启动转推任务 StartPublishCdnStream 同时设置录制相关参数(RecordParams)和转推相关参数(PublishCdnParams.N)即可同时发起录制与转推功能。此接口也可单独发起录制或转推功能。
针对录制参数的设置,提供以下两种设置方式:
录制参数设置方式 | 说明 |
Restful API 参数指定 | 如需灵活调整录制参数,可通过 RecordParams 来设置录制参数,此时 RecordParams -> UniRecord 需设置为3。 |
读取控制台录制模板 | 注意: 通过控制台获取的录制参数时,仅使用您配置的单流录制参数,控制台录制模板中的混流参数不生效,如果发起混流,请通过 StartPublishCdnStream ->AudioParams 和 VideoParams 进行指定。 |
说明:
发起录制任务接口中需要您指定分配录制机器人的进房参数 UserId 和 UserSig(如何获取 UserSig),请不要与您房间内的正常主播或观众使用的 UserId 重复且不可与正在录制中的房间内指定的录制机器人 UserId 一致,否则会导致录制任务失败。
手动录制下,您可以前往控制台配置回调地址,以接受录制回调事件,请见 录制回调说明。
事件回调
录制文件管理
相关费用
实践教程
录制场景
根据录制需求场景的不同,我们提供以下实践说明:
场景一:在转推、媒体处理(混流、转码,加水印等)同时将对应结果同时进行录制下来。
场景二:续录多条流,即将不同时刻的多个主播画面录制到同一个文件中,实现续录。
场景一:录制 + 转推
当您需要对主播流进行转推,或者需要对上行流进行处理,同时有录制的需求时,可以使用转推录制接口,利用转推接口的流处理能力,对流进行灵活处理后进行录制。这里以云 API 为例介绍的转推录制使用方式(后续会支持终端 SDK 接口发起方式)。
1. “录制&转推&混流&水印”任务同时发起。
POST / HTTP/1.1Host: trtc.tencentcloudapi.comContent-Type: application/jsonX-TC-Action: StartPublishCdnStream<公共请求参数>{"SdkAppId": ********,"RoomId": "350","RoomIdType": 0,"AgentParams": {"UserId": "trtc_partner_test_1","UserSig": "********","MaxIdleTime": 10},"WithTranscoding": 1,"AudioParams": {"AudioEncode": {"Codec": 0,"SampleRate": 48000,"Channel": 2,"BitRate": 64},"SubscribeAudioList": [{"UserInfo": {"RoomId": "350","RoomIdType": 0,"UserId": "Trtc_User_1"}},{"UserInfo": {"RoomId": "350","RoomIdType": 0,"UserId": "Trtc_User_0"}}]},"VideoParams": {"VideoEncode": {"Width": 1280,"Height": 720,"Fps": 15,"BitRate": 512,"Gop": 2},"LayoutParams": {"PureAudioHoldPlaceMode": 0,"MixLayoutMode": 1},"BackGroundColor": "0xFF0000","WaterMarkList": [{"WaterMarkType": 0,"WaterMarkImage": {"LocationX": 64,"LocationY": 64,"WaterMarkHeight": 64,"WaterMarkWidth": 128,"WaterMarkUrl": "https://xxxxxxxx.png","ZOrder": 3}}]},"RecordParams": {"UniRecord": 3,"RecordFormat": ["mp4"],"StreamType": 0,"McuStorageParams": {"McuCloudVod": {"McuTencentVod": {"ExpireTime": 86400}}}},"PublishCdnParams": [{"IsTencentCdn": 1,"PublishCdnUrl": "rtmp://xxxxxx"}]}
2. 使用 UpdatePublishCdnStream 将其切换为单流录制 + 转推任务。
POST / HTTP/1.1Host: trtc.tencentcloudapi.comContent-Type: application/jsonX-TC-Action: UpdatePublishCdnStream<公共请求参数>{"SdkAppId": ********,"TaskId": "D0xMnLdRsmIO5+E09Y5wpUh+Q556USkfaMtHzbFuHc19muIw84b4EN1Bc0stJtznupVpRKeyjc-0nDjD8V+HfU8A","SequenceNumber": 5,"WithTranscoding": 0,"SingleSubscribeParams": {"UserMediaStream": {"UserInfo": {"RoomId": "350","RoomIdType": 0,"UserId": "Trtc_User_0"},"StreamType": 0}}}
3. 结束转推录制任务。
POST / HTTP/1.1Host: trtc.tencentcloudapi.comContent-Type: application/jsonX-TC-Action: StopPublishCdnStream<公共请求参数>{"SdkAppId": ********,"TaskId": "D0xMnLdRsmIO5+E09Y5wpUh+Q556USkfaMtHzbFuHc19muIw84b4EN1Bc0stJtznupVpRKeyjc-0nDjD8V+HfU8A"}
场景二:续录多条流
为了实现多个任务的续录,这些任务发起时需要填写相同的 recordkey,并且前一个任务结束后,后一个任务要在指定的续录时间(通过控制台录制模板和Restful API 参数 RecordWaitTime 指定)内发起。
注意:
若不需实现续录多条流,请勿将在发起任务时填写相同的 recordkey。
1. 首先发起录制任务 Task1。
POST / HTTP/1.1Host: trtc.tencentcloudapi.comContent-Type: application/jsonX-TC-Action: StartPublishCdnStream<公共请求参数>{"SdkAppId": ********,"RoomId": "350","RoomIdType": 0,"AgentParams": {"UserId": "trtc_partner_test_1","UserSig": "********","MaxIdleTime": 10},"WithTranscoding": 1,"AudioParams": {"AudioEncode": {"Codec": 0,"SampleRate": 48000,"Channel": 2,"BitRate": 64},"SubscribeAudioList": [{"UserInfo": {"RoomId": "350","RoomIdType": 0,"UserId": "Trtc_User_1"}},{"UserInfo": {"RoomId": "350","RoomIdType": 0,"UserId": "Trtc_User_0"}}]},"VideoParams": {"VideoEncode": {"Width": 1280,"Height": 720,"Fps": 15,"BitRate": 512,"Gop": 2},"LayoutParams": {"PureAudioHoldPlaceMode": 0,"MixLayoutMode": 1}},"RecordParams": {"UniRecord": 3,"RecordFormat": ["mp4"],"StreamType": 0,"RecordKey": "recordkey2403122301","McuStorageParams": {"McuCloudVod": {"McuTencentVod": {"ExpireTime": 86400}}}},"PublishCdnParams": [{"IsTencentCdn": 1,"PublishCdnUrl": "rtmp:xxxxxxx"}]}
2. 结束录制任务 Task1,结束时不指定 recordkey。
POST / HTTP/1.1Host: trtc.tencentcloudapi.comContent-Type: application/jsonX-TC-Action: StopPublishCdnStream<公共请求参数>{"SdkAppId": ********,"TaskId": "D0xMgKlRssqyrNUNqIPkpuwPuC1GLuIfSZN4zbFuHc19muIw84b4EN1Bc0stJtznufPhuidu6JHPSpuljN"}
3. 使用同样的 recordkey 发起续录任务 Task2。
说明:
RecordParams 中的参数以第一次任务为准,后续续录任务指定的 RecordParams 参数不生效,所以录制文件的前缀还是"prefix_test",而不是“prefix_changed”
POST / HTTP/1.1Host: trtc.tencentcloudapi.comContent-Type: application/jsonX-TC-Action: StartPublishCdnStream<公共请求参数>{"SdkAppId": ********,"RoomId": "350","RoomIdType": 0,"AgentParams": {"UserId": "trtc_partner_test_1","UserSig": "********","MaxIdleTime": 10},"WithTranscoding": 0,"AudioParams": {"AudioEncode": {"Codec": 0,"SampleRate": 48000,"Channel": 2,"BitRate": 64}},"VideoParams": {"VideoEncode": {"Width": 1280,"Height": 720,"Fps": 15,"BitRate": 512,"Gop": 2}},"SingleSubscribeParams": {"UserMediaStream": {"UserInfo": {"RoomId": "350","RoomIdType": 0,"UserId": "Trtc_User_0"},"StreamType": 0}},"RecordParams": {"RecordKey": "recordkey2403122301","UniRecord": 3,"RecordFormat": ["mp4"],"StreamType": 0,"McuStorageParams": {"McuCloudVod": {"McuTencentVod": {"ExpireTime": 86400}}}},"PublishCdnParams": [{"IsTencentCdn": 1,"PublishCdnUrl": "rtmp://xxxxxxx"}]}
4. 指定 recordkey,停止录制任务 Task2。
POST / HTTP/1.1Host: trtc.tencentcloudapi.comContent-Type: application/jsonX-TC-Action: StopPublishCdnStream<公共请求参数>{"SdkAppId": ********,"RecordKey": "recordkey2403122301","TaskId": "D0zNfGlRsohMM0sTZo5hlGZD4gkBQp4fCZh4zbFuHc19muIw84b4EN1Bc0stJtznuZDTgfDCsYnCozJw"}
说明:
1. 带 recordkey A,发起任务 A;带 recordkey A,发起任务 B,录制会从录任务 A 切换到录任务 B,虽然任务 A 没退出,但不会再录制。
2. 转推录制的参数以第一次任务发起为准,后续续录任务指定的录制参数(RecordParams 中的参数)不生效。
3. 如果转推录制发起时指定了 recordkey,结束转推录制分几种情况:
3.1 结束转推录制指定同样的 recordkey:
如果此时 recordkey 对应的录制任务正在录制当前流,则转推和录制都立即结束,续录时间不生效。
如果此时 recordkey 对应的录制任务没有录制当前流,则转推立即结束,录制任务不受影响继续进行。如果想要结束录制,需要通过结束录制当前正在录制的转推任务实现。
补充说明:例如使用 recordkey A 先发起转推任务 1,然后用同样的 recordkey A 发起了转推任务 2,此时 recordkey A 对应的录制任务会切换到转推任务 2进行录制;当停止转推任务 1 时 即使填写了 recordkey A,但是因为当前 recordkey A 已经不再录制 转推任务 1,因此无法将录制任务 A 结束;只有在结束 转推任务 2 时才能调用结束任务接口来结束录制任务 A。
3.2 结束转推录制不指定 recordkey:则当前转推结束,录制任务等待续录时间后结束;续录时间内使用同样的 recordkey 发起转推录制任务,则两次转推续录到一个文件中。