场景实践

文档中心 > 实时音视频 > 功能实践 > 实现云端录制与回放

实现云端录制与回放

最近更新时间:2021-09-15 15:11:16

适用场景

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

TRTC 的云端录制,可以将房间中的每一个用户的音视频流都录制成一个独立的文件:

也可以将房间中的多路音视频先进行 云端混流,再将混合后的音视频流录制成一个文件:

控制台指引

开通录制服务

  1. 登录实时音视频控制台,在左侧导航栏选择【应用管理】。
  2. 单击目标应用所在行的【功能配置】,进入功能配置页卡。如果您还没有创建过应用,可以单击【创建应用】,填写应用名称,单击【确定】创建一个新的应用。
  3. 单击【启用云端录制】右侧的 ,会弹出云端录制的设置页面。

选择录制形式

TRTC 的云端录制服务提供了两种不同的录制形式:“全局自动录制”和“指定用户录制”:

  • 全局自动录制
    每一个 TRTC 房间中的每个用户的音视频上行流都会被自动录制下来,录制任务的启动和停止都是自动的,不需要您额外操心,比较简单和易用。具体的使用方法请阅读 方案一:全局自动录制

  • 指定用户录制
    您可以指定只录制一部分用户的音视频流,这需要您通过客户端的 SDK API 或者服务端的 REST API 进行控制,需要额外的开发工作量。具体的使用方法请阅读 方案二:指定用户录制(SDK API)方案三:指定用户录制(REST API)

选择文件格式

云端录制支持 HLS、MP4、FLV 和 AAC 四种不同的文件格式,我们以表格的形式列出四种不同格式的差异和适用场景,您可以结合自身业务的需要进行选择:

参数参数说明
文件类型 支持以下文件类型:
  • HLS:该文件类型支持绝大多数浏览器在线播放,适合视频回放场景。选择该文件类型时,支持断点续录且不限制单个文件最大时长。
  • FLV:该文件类型不支持在浏览器在线播放,但该格式简单容错性好。如果无需将录制文件存储在云点播平台,可以选择该文件类型,录制完成后立刻下载录制文件并删除源文件。
  • MP4:该文件类型支持在 Web 浏览器在线播放,但此格式容错率差,视频通话过程中的任何丢包都会影响最终文件的播放质量。
  • AAC:如果只需录制音频,可以选择该文件类型。
单个文件的最大时长(分钟)
  • 根据实际业务需求设置单个视频文件的最大时长限制,超过长度限制后系统将会自动拆分视频文件。单位为分钟,取值范围1 - 120。
  • 当【文件类型】设置为【HLS】时,不限制单个文件的最大时长,即该参数无效。
文件保存时长(天) 根据实际业务需求设置视频文件存储在云点播平台的天数。单位为天,取值范围0 - 1500,到期后文件将被点播平台自动删除且无法找回, 0表示永久存储。
续录超时时长(秒)
  • 默认情况下,若通话(或直播)过程因网络波动或其他原因被打断,录制文件会被切断成多个文件。
  • 如果需要实现“一次通话(或直播)只产生一个回放链接”,可以根据实际情况设置续录超时时长,当打断间隔不超过设定的续录超时时长时,一次通话(或直播)只会生成一个文件,但需要等待续录时间超时后才能收到录制文件。
  • 单位为秒,取值范围1 - 1800,0表示断点后不续录。
说明:

HLS 支持最长三十分钟的续录,可以做到“一堂课只产生一个回放链接”,且支持绝大多数浏览器的在线观看,非常适合在线教育场景中的视频回放场景。

选择存储位置

TRTC 云端录制文件会默认存储于腾讯云点播服务上,如果您的项目中多个业务公用一个腾讯云点播账号,可能会有录制文件隔离的需求。您可以通过腾讯云点播的“子应用”能力,将 TRTC 的录制文件与其他业务区分开。

  • 什么是点播主应用和子应用?
    主应用和子应用是云点播上的一种资源划分的方式。主应用相当于云点播的主账号,子应用可以创建多个,每一个子应用相当于主账号下面的一个子账号,拥有独立的资源管理,存储区域可以跟其他的子应用相互隔离。

  • 如何开启点播服务的子应用?
    您可以根据文档 “如何开启点播子应用” 添加新的子应用,这一步需要您跳转到点播控制台中进行操作。

设置录制回调

  • 录制回调地址:
    如果您需要实时接收到新文件的 落地通知,可在此处填写您的服务器上用于接收录制文件的回调地址,该地址需符合 HTTP(或 HTTPS)协议。当新的录制文件生成后,腾讯云会通过该地址向您的服务器发送通知。

  • 录制回调密钥:
    回调密钥用于在接收回调事件时生成签名鉴权,该密钥需由大小写字母及数字组成,且不得超过32个字符。相关使用请参见 录制事件参数说明

说明:

详细的录制回调接收和解读方案请参考文档后半部分的:接收录制文件

录制控制方案

TRTC 提供了三种云端录制的控制方案,分别是 全局自动录制指定用户录制(由 SDK API 控制)指定用户录制(由 REST API 控制)。对于其中的每一种方案,我们都会详细介绍:

  • 如何在控制台中设定使用该方案?
  • 如何开始录制任务?
  • 如何结束录制任务?
  • 如何将房间中的多路画面混合成一路?
  • 录制下来的文件会以什么格式命名?
  • 支持该种方案的平台有哪些?

方案一:全局自动录制

  • 控制台中的设定
    要使用该种录制方案,请在控制台中 选择录制形式 时,设定为“全局自动录制”。

  • 录制任务的开始
    TRTC 房间中的每一个用户的音视频流都会被自动录制成文件,无需您的额外操作。

  • 录制任务的结束
    自动停止。即每个主播在停止音视频上行后,该主播的云端录制即会自行停止。如果您在 选择文件格式 时设置了“续录时间”,则需要等待续录时间超时后才能收到录制文件。

  • 多路画面的混合
    全局自动录制模式下的云端混流有两种方案,即“服务端 REST API 方案” 和 “客户端 SDK API 方案”,两套方案请勿混合使用:

    • 服务端 REST API 混流方案:需要由您的服务器发起 API 调用,不受客户端平台版本的限制。
    • 客户端 SDK API 混流方案:可以直接在客户端发起混流,目前支持 iOS、Android、Windows、Mac 和 Electron 等平台,暂不支持微信小程序和 Web 浏览器。
  • 录制文件的命名

    • 如果主播在进房时指定了 userDefineRecordId 参数,则录制文件会以 userDefineRecordId_streamType_开始时间_结束时间 来命名(streamType 有 main 和 aux 两个取值,main 代表主路,aux 代表辅路,辅路通常被用作屏幕分享);
    • 如果主播在进房时没有指定 userDefineRecordId 参数,但指定了 streamId 参数,则录制文件会以 streamId_开始时间_结束时间 来命名;
    • 如果主播在进房时既没有指定 userDefineRecordId 参数,也没有指定 streamId 参数,则录制文件会以 sdkappid_roomid_userid_streamType_开始时间_结束时间 来命名(streamType 有 main 和 aux 两个取值,main 代表主路,aux 代表辅路,辅路通常被用作屏幕分享)。
  • 已经支持的平台
    由您的服务端控制,不受客户端平台限制。

方案二:指定用户录制(SDK API)

通过调用 TRTC SDK 提供的一些 API 接口和参数,即可实现云端混流、云端录制和旁路直播三个功能:

云端能力 如何开始? 如何停止?
云端录制 进房时指定参数 TRTCParams 中的 userDefineRecordId 字段 主播退房时自动停止
云端混流 调用 SDK API setMixTranscodingConfig() 启动云端混流 发起混流的主播退房后,混流会自动停止,或中途调用 setMixTranscodingConfig() 并将参数设置为 null/nil 手动停止
旁路直播 进房时指定参数 TRTCParams 中的 streamId 字段 主播退房时自动停止

  • 控制台中的设定
    要使用该种录制方案,请在控制台中 选择录制形式 时,设定为“指定用户录制”。

  • 录制任务的开始
    主播在进房时指定进房参数 TRTCParams 中的 userDefineRecordId 字段,之后该主播的上行音视频数据即会被云端录制下来,不指定该参数的主播不会触发录制任务。

    // 示例代码:指定录制用户 rexchang 的音视频流,文件 id 为 1001_rexchang
    TRTCCloud *trtcCloud = [TRTCCloud sharedInstance];
    TRTCParams *param = [[TRTCParams alloc] init];
    param.sdkAppId = 1400000123; // TRTC 的 SDKAppID,创建应用后可获得
    param.roomId = 1001; // 房间号
    param.userId = @"rexchang"; // 用户名
    param.userSig = @"xxxxxxxx"; // 登录签名
    param.role = TRTCRoleAnchor; // 角色:主播
    param.userDefineRecordId = @"1001_rexchang"; // 录制 ID,即指定开启该用户的录制。
    [trtcCloud enterRoom:params appScene:TRTCAppSceneLIVE]; // 请使用 LIVE 模式
  • 录制任务的结束
    自动停止,当进房时指定 userDefineRecordId 参数的主播在停止音视频上行后,云端录制会自行停止。如果您在选择文件格式时设置了“续录时间”,则需要等待续录时间超时后才能收到录制文件。

  • 多路画面的混合
    您可以通过调用 SDK API setMixTranscodingConfig() 将房间中其它用户的画面和声音混合到当前用户的这一路音视频流上。关于这一部分详细介绍,可以阅读文档:云端混流转码

    注意:

    在一个 TRTC 房间中,只由一个主播(推荐是开播的主播)来调用 setMixTranscodingConfig 即可,多个主播调用可能会出现状态混乱的错误。

  • 录制文件的命名
    录制文件会以 userDefineRecordId_开始时间_结束时间 的格式来命名。

  • 已经支持的平台
    支持 iOSAndroidWindowsMacElectron 等终端发起录制控制,暂不支持由 Web 浏览器和微信小程序端发起控制。

方案三:指定用户录制(REST API)

TRTC 的服务端提供了一对 REST API( StartMCUMixTranscodeStopMCUMixTranscode)用于实现云端混流、云端录制和旁路直播三个功能:

云端能力 如何开始? 如何停止?
云端录制 调用 StartMCUMixTranscode 时指定 OutputParams.RecordId 参数即可开始录制 自动停止,或中途调用 StopMCUMixTranscode 停止
云端混流 调用 StartMCUMixTranscode 时指定 LayoutParams 参数可设置布局模板和布局参数 所有用户退房后自动停止,或中途调用 StopMCUMixTranscode 手动停止
旁路直播 调用 StartMCUMixTranscode 时指定 OutputParams.StreamId 参数可启动到 CDN 的旁路直播 自动停止,或中途调用 StopMCUMixTranscode 停止
说明:

由于这对 REST API 控制的是 TRTC 云服务中的核心混流模块 MCU,并将 MCU 混流后的结果输送给录制系统和直播 CDN,因此 API 的名字被称为 Start/StopMCUMixTranscode。因此,从功能角度上来说,Start/StopMCUMixTranscode 不仅仅可以实现混流的功能,也可以实现云端录制和旁路直播 CDN 的功能。

  • 控制台中的设定
    要使用该种录制方案,请在控制台中 选择录制形式 时,设定为“指定用户录制”。

  • 录制任务的开始
    由您的服务器调用 StartMCUMixTranscode ,并指定 OutputParams.RecordId 参数即可启动混流和录制。

    // 代码示例:通过 REST API 启动云端混流和云端录制任务
    https://trtc.tencentcloudapi.com/?Action=StartMCUMixTranscode
    &SdkAppId=1400000123
    &RoomId=1001
    &OutputParams.RecordId=1400000123_room1001
    &OutputParams.RecordAudioOnly=0
    &EncodeParams.VideoWidth=1280
    &EncodeParams.VideoHeight=720
    &EncodeParams.VideoBitrate=1560
    &EncodeParams.VideoFramerate=15
    &EncodeParams.VideoGop=3
    &EncodeParams.BackgroundColor=0
    &EncodeParams.AudioSampleRate=48000
    &EncodeParams.AudioBitrate=64
    &EncodeParams.AudioChannels=2
    &LayoutParams.Template=1
    &<公共请求参数>

注意:

  • 该 REST API 需要在房间中至少有一个用户进房(enterRoom)成功后才有效。
  • 使用 REST API 不支持单流录制,如果您需要单流录制,请选择 方案一 或者 方案二
  • 录制任务的结束
    自动停止,您也可以中途调用 StopMCUMixTranscode 停止混流和录制任务。

  • 多路画面的混合
    在调用 StartMCUMixTranscode 时同时指定 LayoutParams 参数即可实现云端混流。该 API 支持在整个直播期间多次调用,即您可以根据需要修改 LayoutParams 参数并再次调用该 API 来调整混合画面的布局。但需要注意的是,您需要保持参数 OutputParams.RecordIdOutputParams.StreamId 在多次调用中的一致性,否则会导致断流并产生多个录制文件。

说明:

关于云端混流的详细介绍,具体请参见 云端混流转码

  • 录制文件的命名
    录制文件会以调用 StartMCUMixTranscode 时指定的 OutputParams.RecordId 参数来命名,命名格式为 OutputParams.RecordId_开始时间_结束时间

  • 已经支持的平台
    由您的服务端控制,不受客户端平台的限制。

查找录制文件

在开启录制功能以后,TRTC 系统中录制下来的文件就能在腾讯云点播服务中找到。您可以直接在云点播控制台手动查找,也可以由您的后台服务器使用 REST API 进行定时筛选:

方式一:在点播控制台手动查找

  1. 登录 云点播控制台,在左侧导航栏选择【媒资管理】。
  2. 单击列表上方的【前缀搜索】,选择【前缀搜索】,在搜索框输入关键词,例如1400000123_1001_rexchang_main,单击,将展示视频名称前缀相匹配的视频文件。
  3. 您可以根据创建时间筛选所需的目标文件。

方式二:通过点播 REST API 查找

腾讯云点播系统提供了一系列 REST API 来管理其上的音视频文件,您可以通过 搜索媒体信息 这个 REST API 来查询您在点播系统上的文件。您可以通过请求参数表中的 Text 参数进行模糊匹配,也可以根据 StreamId 参数进行精准查找。
REST 请求示例:

https://vod.tencentcloudapi.com/?Action=SearchMedia
&StreamId=stream1001
&Sort.Field=CreateTime
&Sort.Order=Desc
&<公共请求参数>

接收录制文件

除了 查找录制文件,您还可以通过配置回调地址,让腾讯云主动把新录制文件的消息推送给您的服务器。
房间里的最后一路音视频流退出后,腾讯云会结束录制并将文件转存到云点播平台,该过程大约默认需要30秒至2分钟(若您设置了续录时间为300秒,则等待时间将在默认基础上叠加300秒)。转存完成后,腾讯云会通过您在 设置录制回调 中设置的回调地址(HTTP/HTTPS)向您的服务器发送通知。

腾讯云会将录制和录制相关的事件都通过您设置的回调地址推送给您的服务器,回调消息示例如下图所示:

您可以通过下表中的字段来确定当前回调是对应的哪一次通话(或直播):

序号字段名说明
event_type 消息类型,当 event_type 为100时,表示该回调消息为录制文件生成的消息。
stream_id 即直播 CDN 的 streamId,您可以在进房时通过设置 TRTCParams 中的 streamId 字段指定(推荐),也可以在调用 TRTCCloud 的 startPublishing 接口时通过参数 streamId 来指定。
stream_param.userid 用户名的 Base64 编码。
stream_param.userdefinerecordid 自定义字段,您可以通过设置 TRTCParams 中的 userDefineRecordId 字段指定。
video_url 录制文件的观看地址,可以用于 点播回放
说明:

更多回调字段说明,请参见 云直播-录制事件通知

删除录制文件

腾讯云点播系统提供了一系列 REST API 来管理其上的音视频文件,您可以通过 删除媒体 API 删除某个指定的文件。
REST 请求示例:

https://vod.tencentcloudapi.com/?Action=DeleteMedia
&FileId=52858907988664150587
&<公共请求参数>

回放录制文件

在线教育等场景中,通常需要在直播结束后多次回放录制文件,以便充分利用教学资源。

选择文件格式(HLS)

设置录制格式 中选择文件格式为 HLS。
HLS 支持最长三十分钟的断点续录,可以做到“一场直播(或一堂课)只产生一个回放链接”,且 HLS 文件支持绝大多数浏览器在线播放,非常适合视频回放场景。

获取点播地址(video_url)

接收录制文件 时,可以获取回调消息中 video_url 字段,该字段为当前录制文件在腾讯云的点播地址。

对接点播播放器

根据使用平台对接点播播放器,具体操作参考如下:

注意:

建议使用 专业版 TRTC SDK,专业版集合了 超级播放器(Player+)移动直播(MLVB) 等功能,由于底层模块的高度复用,集成专业版的体积增量要小于同时集成两个独立的 SDK,并且可以避免符号冲突(symbol duplicate)的困扰。

相关费用

云端录制与回放的相关费用包含以下几项,其中录制费用是基础费用,其他费用则会根据您的使用情况而按需收取。

说明:

本文中的价格为示例,仅供参考。若价格与实际不符,请以 云端录制计费说明云直播云点播 的定价为准。

录制费用:转码或转封装产生的计算费用

由于录制需要进行音视频流的转码或转封装,会产生服务器计算资源的消耗,因此需要按照录制业务对计算资源的占用成本进行收费。

注意:

  • 自2020年7月1日起首次在 TRTC 控制台创建应用的腾讯云账号,使用云端录制功能后产生的录制费用以 云端录制计费说明 为准。
  • 在2020年7月1日之前已经在 TRTC 控制台创建过应用的腾讯云账号,无论是在2020年7月1日之前还是之后创建的应用,使用云端录制功能产生的录制费用均默认继续延用直播录制的计费规则。

直播录制计费的计算方法是按照并发录制的路数进行收费,并发数越高录制费用越高,具体计费说明请参见 云直播 > 直播录制

例如,您目前有1000个主播,如果在晚高峰时,最多同时有500路主播的音视频流需要录制。假设录制单价为30元/路/月,那么总录制费用为 500路 × 30元/路/月 = 15000元/月
如果您在 设置录制格式 时同时选择了两种录制文件,录制费用和存储费用都会 × 2,同理,选择三种文件时录制费用和存储费用会 × 3。 如非必要,建议只选择需要的一种文件格式,可以大幅节约成本。

存储费用:如将文件存储于腾讯云则会产生该费用
如果录制出的文件要存放于腾讯云,由于存储本身会产生磁盘资源的消耗,因此需要按照存储的资源占用进行收费。存储的时间越久费用也就越高,因此如无特殊需要,您可以将文件的存储时间设置的短一些来节省费用,或者将文件存放在自己的服务器上。存储费用可以选择 视频存储(日结)价格 进行日结计算,也可以购买 存储资源包

例如,您通过 setVideoEncoderParam() 设置主播的码率(videoBitrate)为1000kbps,录制该主播的直播视频(选择一种文件格式),录制一小时大约会产生一个 (1000 / 8)KBps × 3600秒 = 450000KB = 0.45GB 大小的视频文件,该文件每天产生的存储费用约为 0.45GB × 0.0048 元/GB/日 = 0.00216‬元

观看费用:如将文件用于点播观看则会产生该费用

如果录制出的文件要被用于点播观看,由于观看本身会产生 CDN 流量消耗,因此需要按照点播的价格进行计费,默认按流量收费。观看的人数越多费用越高,观看费用可以选择 视频加速(日结)价格 进行日结计算,也可以购买 流量套餐包

例如,您通过云端录制产生了一个1GB大小的文件,且有1000位观众从头到尾完整地观看了视频,大约会产生1TB的点播观看流量,那么按照阶梯价格表,1000位观众就会产生 1000 × 1GB × 0.23元/GB = 230元 的费用,按照流量套餐包则是175元。
如果您选择从腾讯云下载文件到您的服务器上,也会产生一次很小的点播流量消耗,并且会在您的月度账单中有所体现。

转码费用:如开启混流录制则会产生该费用

如果您启用了混流录制,由于混流本身需要进行解码和编码,所以还会产生额外的混流转码费用。 混流转码根据分辨率大小和转码时长进行计费,主播用的分辨率越高,连麦时间(通常在连麦场景才需要混流转码)越长,费用越高,具体费用计算可以参考 直播转码

例如,您通过 setVideoEncoderParam() 设置主播的码率(videoBitrate)为1500kbps,分辨率为720P。如果有一位主播跟观众连麦了一个小时,连麦期间开启了 云端混流,那么产生的转码费用为 0.0325元/分钟 × 60分钟 = 1.95元

相关问题

实时音视频如何实现服务端录制?

服务端录制需要使用 Linux SDK。Linux SDK 暂未完全开放,若您需咨询或使用相关服务,请填写 Linux SDK 问卷。我们会在2个-3个工作日内完成评估并反馈结果。

目录