视频直播录制可对当前直播实时录制并进行历史回放。本文介绍视频直播录制功能。
功能介绍
视频直播是以实时流的形式播放推流端数据,如果想要在直播结束后再次观看,就必须要使用直播录制功能。
直播录制就是将直播中心接收到的推流数据进行录制,保存至您指定的存储位置。目前直播录制存储提供两种方式,录制存储至VOD和录制存储至OSS。
直播录制的原理
直播录制的过程,是通过拉取您推上来的直播流,将音视频封装成一个个单独的媒体切片(封装格式为TS),然后进行储存。直播录制在工作时遵循以下原则:
直播录制只修改音视频的封装格式(RTMP/FLV转成TS),绝不修改音视频内容(即编码层内容)。举个例子,如果您推送上来的直播流是花屏的,那么录制下来的也是花屏的。
直播录制有权限往用户存储地址写入录制文件,但是不会也没有权限修改/删除用户存储地址的任务文件(包括已写入的录制文件)。用户存储地址中的录制文件,完全由您自己管理。
使用直播录制功能会产生录制服务费,默认录制文件格式为TS/M3U8,如需转码封装处理,将产生录制转封装费。计费规则请参见直播录制费用。
限制条件
音视频编码格式
由于直播录制需要先将直播流切分成TS文件,因此您推上来的直播流的音视频编码格式必须满足TS封装格式的要求。根据FLV标准和ISO/IEC 13818-1标准,直播录制目前仅支持以下编码格式:
视频:H264、HEVC、MPEG4
音频:AAC、MP3
如果直播流包含了非以上格式编码的音视频,直播录制可能会出现:无法生成录制文件、录制黑屏、录制没有声音,以及其他一些无法预见的异常情况。
异常直播流处理机制
标准流(满足编码要求且帧率/时间戳稳定) ✅ 100%正常生成录制文件
轻微异常流(偶发帧率波动/时间戳跳变) ✅ 系统自动兼容处理
严重异常流(长期无视频帧/时间戳错乱/关键帧缺失) ❌ 无法保证录制成功率
功能对比
录制存储至VOD和录制存储至OSS都可以对直播内容进行录制存储。两者使用场景有所不同,您可以根据自己的业务决定具体采用哪种方式进行存储。
存储方式 | 关联产品服务 | 支持录制方式 | 封装格式 | 适用场景 |
存储方式 | 关联产品服务 | 支持录制方式 | 封装格式 | 适用场景 |
录制存储至VOD | 开通视频点播服务 |
|
| 倾向于对录制内容进行二次生产,注重录制内容后期处理,如剪辑,播放,设置录制视频封面等。 |
录制存储至OSS | 开通OSS服务 |
| 倾向于录制内容管理,注重存储。 |
同一个直播流不能同时配置两种存储方式。
直播录制都会先将直播流切片成一个个的TS切片,然后再合成对应封装格式的录制文件。封装为除TS/M3U8外的格式将产生转封装费用。
自动录制生效规则
您可以指定域名、应用名或流名称,录制某个域名下所有App或App下所有的直播流,也可以精确录制某一路直播流。AppName和StreamName可以填为*,表示所有AppName和所有StreamName。
配置存储至OSS或存储至VOD的录制模板时您可以配置多个录制模板,但是如果出现一路直播流同时可以匹配到多个录制模板时,录制模板生效存在优先级,具体优先级如下(数值越小,优先级越高):
优先级 | DomainName | AppName | StreamName |
优先级 | DomainName | AppName | StreamName |
1 | ✓ | ✓ | ✓ |
2 | ✓ | ✓ | * |
3 | ✓ | * | * |
✓ 代表通过控制台或API配置自动录制规则时对应参数有值,且值不为*,* 代表对应参数值为*。
录制存储至VOD
前置条件
若采用录制存储至VOD方式进行直播录制功能配置,需要开通视频点播服务,并进行配置管理存储Bucket。
录制文件存储在视频点播VOD中,会产生存储费用,在VOD中计费请参见点播基础服务计费。
在启用点播系统Bucket时,需要注意点播系统Bucket需要与待配置域名的直播中心同地域。
使用金融云账号不支持视频直播录制到点播。
功能配置
视频直播目前提供两种方式添加录制存储至VOD配置。
完成配置后重新推流录制配置才会生效。
断流180秒后生成录制文件。
- 登录视频直播控制台。
在左侧导航栏选择功能管理>直播录制,进入直播录制页面,选择存储至VOD配置页签。
选择待配置的播流域名,并且单击添加。
配置录制模板。
录制模板参数及说明如下表所示。
参数
描述
AppName
视频的应用名称,输入的AppName必须与直播推流的AppName保持一致,方可生效。如果您想要进行域名级别录制,输入星号(*)即可。
StreamName
存储至VOD支持流级别的录制。您只需输入指定的流名称即可。如果您想要进行全部流录制,即该AppName下的流全部录制,输入星号(*)即可。
AppName与StreamName参数支持英文、数字、“-”、“_”符号,长度限制在255个字符以内。
存储地址
选择存储位置。
录制周期
录制周期为当前直播转为点播文件后的最大时长。范围为15~360分钟,最大支持 6 小时录制。超过 6 小时,系统将按照录制命名规则生成新文件。ts切片时长默认为 30s。
录制转码模板
从列表中选择存储转码规则,可以在点播服务中对录制的视频进行转码处理。可转码为不同规格的视频,也可以不转码即保持原画格式。
录制转码模板具体操作,请参见视频点播转码配置。
视频点播转码模板所在区域需与您当前域名所在区域保持一致。例如:当前域名为华东2区,视频点播转码模板区域也需要在华东2区。
自动合并开关
开启后可在直播录制结束后自动将多个录制周期文件合并成一个录制文件存储到VOD中。
自定合并转码模板
从列表中选择存储转码规则,对自动合成出来的视频在点播服务中进行一次转码,录制转码规则从当前点播系统中获取。自动合并转码模板具体操作,请参见转码模板。
视频点播转码模板所在区域需与您当前域名所在区域保持一致。例如:当前域名为华东2区,视频点播转码模板区域也需要在华东2区。
单击确定。
调用AddLiveRecordVodConfig - 添加直播录制转点播配置接口添加配置。SDK调用参考如下:
//需要将<>内容替换成实际使用的值
DefaultProfile profile = DefaultProfile.getProfile("<regionId>", "<ALIBABA_CLOUD_ACCESS_KEY_ID>", "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>");
IAcsClient client = new DefaultAcsClient(profile);
AddLiveRecordVodConfigRequest addLiveRecordVodConfigRequest=new AddLiveRecordVodConfigRequest();
addLiveRecordVodConfigRequest.setDomainName("<DomainName>");
addLiveRecordVodConfigRequest.setAppName("<AppName>");
addLiveRecordVodConfigRequest.setStreamName("<StreamName>");
addLiveRecordVodConfigRequest.setVodTranscodeGroupId("VOD_NO_TRANSCODE");
//点播系统Bucket地址
addLiveRecordVodConfigRequest.setStorageLocation("<StorageLocation>");
AddLiveRecordVodConfigResponse addLiveRecordVodConfigResponse = null;
try {
addLiveRecordVodConfigResponse = client.getAcsResponse(addLiveRecordVodConfigRequest);
} catch (ClientException e) {
e.printStackTrace();
}
System.out.println(new Gson().toJson(addLiveRecordVodConfigResponse));
以上示例代码表示,对<DomainName>域名进行录制存储至VOD配置,AppName为<AppName>,StreamName为<StreamName>。录制内容不进行转码(VOD_NO_TRANSCODE),存储至点播系统Bucket<StorageLocation>。
AppName和StreamName配置详情请参见:自动录制生效规则。
录制内容转码
录制存储至VOD文件格式为m3u8,如果想存储其他格式可以通过配置录制转码模板实现。
addLiveRecordVodConfigRequest.setVodTranscodeGroupId("<TranscodeGroupId>");
转码模板需要在点播系统进行配置,具体操作请参见点播转码模板。
<TranscodeGroupId>为点播系统配置的转码模板组ID。
配置转码后,会对录制文件进行转码(原文件仍然保留),生成转码地址。
录制存储至OSS
前置条件
若采用录制存储至OSS方式进行直播录制功能配置,需要开通OSS服务以及创建Bucket,具体操作请参见配置OSS。
录制文件存储在OSS中,会产生存储费用,在OSS中计费请参见存储费用。
OssBucket需要与待配置域名的直播中心同地域。
功能配置
视频直播目前提供两种方式添加录制存储至OSS配置。
完成配置后重新推流录制配置才会生效。
断流超过断流拼接时长(默认180秒)后生成录制文件。
- 登录视频直播控制台。
在左侧导航栏选择功能管理>直播录制,进入直播录制页面,选择存储至OSS配置页签。
选择待配置的播流域名,并单击添加。
配置录制模板。
表 1. 录制模板参数
参数
描述
AppName
视频的应用名称,输入的AppName必须与直播推流地址的AppName保持一致,方可生效。如果您想要进行域名级别录制,输入星号(*)可。
StreamName
存储至OSS支持流级别的录制。您只需输入指定的流名称即可。如果您想要进行全部流录制,即该AppName下的流全部录制,输入星号(*)可。
AppName与StreamName参数支持英文、数字、短划线(-)、下划线(_)符号,长度限制在255字符以内。
*号只能作为单独输入,无法在字符串中作为通配符输入。
存储位置
选择存储位置。
存储Bucket分为两类:
标准Bucket:用于常规文件存储
媒体Bucket:专用于视频转码处理,存入该类型的文件可自动触发MPS转码任务
当前系统未对Bucket类型进行标识区分,如需执行视频转码,请自行记录所使用的媒体Bucket名称,以确保转码后的媒体文件存储位置准确。
断流拼接时长
直播断流时长超过设定的拼接时长后,将会生成新文件,断流拼接时长支持15~21600秒。
存储格式
支持flv、m3u8、mp4、cmaf四种格式。
至少配置一个存储格式,其中CMAF格式不能与M3U8格式同时选择。
存储规则
默认的存储路径为:record/{AppName}/{StreamName}/{EscapedStartTime }_{EscapedEndTime } 。
示例:
AppName为liveApp****,StreamName为liveStream****,当录制m3u8格式的存储路径为record/liveApp****/liveStream****/{EscapedStartTime}_{EscapedEndTime }。
单个TS时长
单个切片时长,默认为30秒。支持单个TS时长范围5~30秒。
录制周期
录制周期范围为15分钟~360分钟,最大支持6小时录制。超过6小时,系统将按照录制命名规则生成新文件。
录制周期为当前直播转为点播文件后的最大时长。
配置录制转码流。(可选)
使用直播转码功能会产生转码费用,按转码标准、分辨率规格及对应总转码时长计费。计费规则详见直播转码费用。
表 2. 录制转码流参数
参数
描述
录制转码流
打开录制转码流开关,配置参数。
存储格式
支持flv、m3u8、mp4、cmaf四种格式。
至少配置一个存储格式,其中CMAF格式不能与M3U8格式同时选择。
存储规则
默认的存储路径为:transcodeRecord/{AppName}/{StreamName}/{EscapedStartTime }_{EscapedEndTime }。
示例:
AppName为liveApp****,StreamName为liveStream****,转码模板ID为lld,当录制m3u8格式的实际存储路径为transcodeRecord/liveApp****/liveStream****_lld/{EscapedStartTime}_{EscapedEndTime }。
单个TS时长
单个切片时长,默认为30秒。支持单个TS时长5~30秒。
录制周期
录制周期范围为15分钟~360分钟,最大支持6小时录制。超过6小时,系统将按照录制命名规则生成新文件。
录制周期为当前直播转为点播文件后的最大时长。
转码模板ID
支持选择指定转码模板(上限10个)或全部转码模板。
转码模板所属AppName需和录制模板保持一致才可生效,若无转码模板,请先添加转码模板,请参见通用转码。
单击确定。
调用AddLiveAppRecordConfig - 添加录制配置接口添加配置。SDK调用参考如下:
//需要将<>内容替换成实际使用的值
DefaultProfile profile = DefaultProfile.getProfile("<regionId>", "<ALIBABA_CLOUD_ACCESS_KEY_ID>", "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>");
IAcsClient client = new DefaultAcsClient(profile);
AddLiveAppRecordConfigRequest addLiveAppRecordConfigRequest=new AddLiveAppRecordConfigRequest();
addLiveAppRecordConfigRequest.setAppName("<AppName>");
addLiveAppRecordConfigRequest.setStreamName("<StreamName>");
addLiveAppRecordConfigRequest.setDomainName("<DomainName>");
addLiveAppRecordConfigRequest.setOssEndpoint("<OssEndpoint>");
addLiveAppRecordConfigRequest.setOssBucket("<OssBucket>");
List<AddLiveAppRecordConfigRequest.RecordFormat> formatList=new ArrayList<AddLiveAppRecordConfigRequest.RecordFormat>();
AddLiveAppRecordConfigRequest.RecordFormat m3u8Format=new AddLiveAppRecordConfigRequest.RecordFormat();
m3u8Format.setFormat("m3u8");
//OSS存储的录制文件名
m3u8Format.setOssObjectPrefix("<record/{AppName}/{StreamName}/{EscapedStartTime}_{EscapedEndTime}>");
//切片名称
m3u8Format.setSliceOssObjectPrefix("<record/{AppName}/{StreamName}/{UnixTimestamp}_{Sequence}>");
formatList.add(m3u8Format);
addLiveAppRecordConfigRequest.setRecordFormats(formatList);
AddLiveAppRecordConfigResponse addLiveAppRecordConfigResponse = null;
try {
addLiveAppRecordConfigResponse = client.getAcsResponse(addLiveAppRecordConfigRequest);
} catch (ClientException e) {
e.printStackTrace();
}
System.out.println(new Gson().toJson(addLiveAppRecordConfigResponse));
以上示例代码表示,对<DomainName>域名进行录制存储至OSS配置,AppName为<AppName>,StreamName为<StreamName>,储存格式为m3u8,存储至<OssBucket>中。
<OssEndpoint>可通过<OssBucket>所属地域在OSSOSS地域和访问域名进行查看。
AppName和StreamName配置详情请参见:自动录制生效规则。
录制转码流
如果希望在存储录制内容时减少录制文件体积,可通过录制转码流实现(在保证画质质量的前提下,调整视频码率、提高视频压缩率、减小文件体积)。录制存储至OSS功能支持同时存储转码流与原始流,也支持仅存储转码流或原始流。
使用直播转码功能会产生转码费用,按转码标准、分辨率规格及对应总转码时长计费。计费规则详见直播转码费用。
自定义录制策略
在功能配置中,我们进行了直播录制功能的配置,在直播推流时即会开始对直播内容进行录制,我们称其为自动录制。
但有些时候,我们希望能够通过业务决策自主决定是否需要对某一次直播内容进行录制。直播录制功能提供了解决这类问题的方法,自主决定录制分为两种情况:
由直播中心回调询问您的业务系统是否需要对该直播内容进行录制,得到响应需要录制后再进行录制,我们称其为按需录制。
由您的业务系统给直播服务发出通知对直播内容进行录制,我们称其为手动录制。
实现按需录制,需要您业务系统提供直播服务调用的URL地址,具体说明可参见按需录制回调。
设置录制功能按需录制示例代码如下:
//OnDemand字段填1,表示通过HTTP回调开启按需录制。
addLiveAppRecordConfigRequest.setOnDemand(1);
同时调用 AddLiveRecordNotifyConfig - 添加域名级别录制回调配置API进行录制回调配置。
实现手动录制,需要将自动录制功能关闭。示例代码如下:
//OnDemand字段填7,表示不进行自动录制。
addLiveAppRecordConfigRequest.setOnDemand(7);
然后在直播的过程中,您可以根据业务情况通过调用 RealTimeRecordCommand - 实时录制指令API开启录制。
停止录制
无论是自动录制,按需录制,手动录制,都可以调用RealTimeRecordCommand - 实时录制指令API主动停止录制。
//需要将<>内容替换成实际使用的值
RealTimeRecordCommandRequest realTimeRecordCommandRequest=new RealTimeRecordCommandRequest();
realTimeRecordCommandRequest.setCommand("stop");
realTimeRecordCommandRequest.setAppName("<AppName>");
realTimeRecordCommandRequest.setStreamName("<StreamName>");
realTimeRecordCommandRequest.setDomainName("<DomainName>");
RealTimeRecordCommandResponse realTimeRecordCommandResponse = null;
try {
realTimeRecordCommandResponse = client.getAcsResponse(realTimeRecordCommandRequest);
} catch (ClientException e) {
e.printStackTrace();
}
System.out.println(new Gson().toJson(realTimeRecordCommandResponse));
setCommand("stop")表示停止录制。
主动停止录制,同样需等待断流拼接时长之后才会生成录制文件。
如果录制的是转码流,此处需要将<StreamName>设置成
StreamName
加_转码模板ID
的形式。
相关文档
使用直播录制时遇到问题,请参见直播录制常见问题。
使用Java SDK,请参见Java SDK使用说明。
- 本页导读 (1)
- 功能介绍
- 直播录制的原理
- 限制条件
- 功能对比
- 自动录制生效规则
- 录制存储至VOD
- 前置条件
- 功能配置
- 录制内容合并
- 录制文件管理
- 录制存储至OSS
- 前置条件
- 功能配置
- 自定义录制策略
- 断流拼接
- 录制周期配置
- 录制内容合并与提取
- 录制文件管理
- 相关文档