直播录制是指将推送的直播流实时转换成TS媒体切片后保存到OSS或VOD中的过程。它将直播内容封装成TS、M3U8、MP4或FLV等格式的视频文件,并支持H264、HEVC、MPEG4的视频编码和AAC、MP3的音频编码。用户可以通过直播控制台或API接口选择不同的录制方式,包括自动录制、定时任务录制、按需录制和手动录制。录制完成后,用户可以通过直播控制台查询录制文件,设置录制文件回调或进行实时处理。本文为您详细介绍直播录制相关信息(包括录制原理、录制文件的存储、录制方法等),您可以参考本章节完成直播录制操作。
直播录制原理
直播录制的过程,是通过拉取您推上来的直播流,将音视频封装成单独的一个个媒体切片(封装格式为TS),然后存入您指定的OSS bucket或者存入到点播系统生成点播文件。直播录制在工作时遵循以下原则:
直播录制只修改音视频的封装格式(RTMP/FLV转成TS),绝不修改音视频内容(即编码层内容)。举个例子,如果您推上来的直播流是花屏的,那录制下来的也是花屏的。
直播录制有权限往用户bucket写入录制文件,但不会且没有权限修改/删除用户bucket的任务文件(包括已写入的录制文件)。用户bucket中的录制文件,完全由您自己管理。
录制存储方式
同一路直播流录制到VOD和录制到OSS Bucket二者不能同时生效,只能选择其中一种方式。
视频直播提供以下两种录制文件的存储方式,您可以根据需要进行选择:
录制存储至OSS:OSS Bucket必须与播放域名的直播中心同地域,不支持跨地域录制。
录制存储至VOD:将直播内容进行录制存储,并转入视频点播系统中,按点播录制规则生成点播文件。视频点播支持使用云剪辑功能对直播流的内容进行剪辑加工,实现视频直播与短视频的内容联动。
录制文件的封装格式
直播录制支持将直播流录制成TS/M3U8、MP4、FLV封装格式的视频文件。但是不管是哪种封装格式,直播录制都会先将直播流切片成一个个的TS切片,然后再合成对应封装格式的录制文件。
对于M3U8,直播录制会将TS和M3U8都写入用户的bucket(因为M3U8只是HLS协议中的索引文件,音视频数据仍然在TS中);而对于MP4和FLV,用户bucket中只会有合成后的MP4和FLV切片。
限制条件
录制存储至OSS
录制存储至OSS的前提条件是您已创建OSS Bucket,且OSS Bucket必须与播放域名的直播中心同地域,不支持跨地域录制。具体操作,请参见创建OSS Bucket。
正常情况下,开通直播服务时,您已自动授权“允许直播服务写入用户OSS”,因此直播录制写入您指定的bucket时不存在权限问题。如果该权限意外被删除,您可以参考以下方法重新配置:
通过控制台配置:您需要授权视频直播可将视频内容写入OSS产品的权限,授权后才能将视频存储至指定的OSS bucket中。具体操作,请参见配置直播写入OSS权限。
通过RAM进行权限配置:详情信息,请参见创建RAM用户并授权。
录制存储至VOD
录制存储至VOD的前提条件:您需要先开通视频点播服务,且开通点播服务的区域必须与播放域名的直播中心同地域才能将视频存储至VOD。视频点播服务详细操作,请参见开通视频点播。
音视频编码格式
由于直播录制需要先将直播流切分成TS文件,因此您推上来的直播流的音视频编码格式必须满足TS封装格式的要求。根据FLV标准和ISO/IEC 13818-1标准,直播录制目前仅支持以下编码格式:
视频:H264、HEVC、MPEG4
音频:AAC、MP3
说明如果直播流包含了非以上格式编码的音视频,直播录制可能会出现:无法生成录制文件、录制黑屏、录制没有声音,以及其他一些无法预见的异常情况。
异常的直播流
对于正常的直播流(没有不支持的编码格式、帧率稳定、时间戳单调线性增长),直播录制均能正常生成录制文件。当然,对于偶尔帧率不稳定,时间戳跳变的流,直播录制也能做出一定的兼容,保证录制文件的正常生成。
但如果推上来的直播流存在严重异常(长时间没有视频帧,时间戳增长没有规律,音视频头缺失等),直播录制可能无法保证正常生成录制文件。
不同录制方式及使用场景
视频直播提供以下录制方式,您可根据具体的场景进行选择和使用:
录制方式 | 使用场景 | 配置方式 | 存储位置 |
录制时可精确到某一路流。您可以输入指定的域名、应用名或流名称,录制某一路直播流。 |
| 支持两种存储方式:
| |
您可以通过API控制录制的开始与结束时间,在您指定的时间内进行录制。 | 调用API接口 | 仅支持录制存储至OSS | |
您可以配置一个回调,通过回调的方法精准控制每一路流的录制方式。 | 调用API接口 | 仅支持录制存储至OSS | |
默认不录制。您可以通过调用接口来进行手动录制。 | 调用API接口 | 仅支持录制存储至OSS |
按域名、AppName、StreamName多级别自动录制
直播录制支持按域名、AppName、StreamName多级别的方式进行录制。您可以指定域名、应用名或流名称,录制某个域名下或App下所有的直播流,也可以精确录制某一路直播流。
配置存储至OSS或存储至VOD的录制模板时您可以配置多个录制模板,但是如果出现一路直播流同时可以匹配到多个录制模板时,录制模板生效存在优先级,具体优先级如下(数值越小,优先级越高):
优先级 | DomainName | AppName | StreamName |
1 | ✓ | ✓ | ✓ |
2 | ✓ | ✓ | * |
3 | ✓ | * | * |
✓ 代表通过控制台或API配置自动录制规则时对应参数有值,且值不为*,* 代表对应参数值为*。
同一路直播流不能同时选择录制到OSS和录制到VOD,只能选择其中一种方式。具体实现方式如下:
录制存储至OSS
通过视频直播控制台:
具体操作,请参见录制存储至OSS。
API调用流程:
配置录制规则,调用接口请参见AddLiveAppRecordConfig。
进行推流,详细内容请参见推流、拉流与播流。
其他相关API参考:
API名称
说明
删除App级别录制配置,如果不再需要某项规则,可以通过该接口删除。
查询所有配置的规则列表.
录制存储至VOD
通过视频直播控制台:
具体操作,请参见录制存储至VOD。
API调用流程:
配置录制规则,调用接口请参见AddLiveRecordVodConfig。
进行推流,详细内容请参见推流、拉流与播流。
其他相关API参考:
API名称
说明
如果不再需要直播录制转点播配置,可以通过该接口删除。
查询直播转点播所有配置列表。
按定时任务自动录制
该功能仅针对流级别的配置生效(即配置中StreamName字段不为空才生效)。
如果您希望在指定的开始时间和结束时间内对一路直播流进行定时录制,可以通过调用API的方式来实现定时任务的自动录制。
API调用流程:
配置自动录制规则,调用接口请参见AddLiveAppRecordConfig。
进行推流,详细内容请参见推流、拉流与播流。
相关API参考:
API名称 | 说明 |
删除App级别录制配置,如果不再需要某项规则,可以通过该接口删除。 | |
查询所有配置的规则列表. |
实践示例
例如:创建DomainName为example.com
,AppName为liveApp****
,StreamName为liveStream****
,北京时间为2019-02-15 09:00:00到2019-02-15 21:00:00的录制任务。同时录制为M3U8和MP4两种格式,M3U8格式单个录制文件周期默认为6小时(即RecordFormat.1.CycleDuration不传值),MP4格式单个录制文件的录制周期设置为半小时,录制到oss-cn-shanghai.aliyuncs.com名为liveBucket****的bucket中:
调用AddLiveAppRecordConfig接口,参数如下:
/?AppName=liveApp**** &DomainName=example.com &StreamName=liveStream**** &OssBucket=liveBucket**** &OssEndpoint=oss-cn-shanghai.aliyuncs.com &RecordFormat.1.Format=m3u8 &RecordFormat.2.Format=mp4 &RecordFormat.2.CycleDuration=1800 &StartTime=2019-02-15T01:00:00Z &EndTime=2019-02-15T13:00:00Z &<公共请求参数>
说明StartTime和EndTime字段填的是UTC时间(假设您本地为北京时间,UTC时间=北京时间-8),请注意和本地时区的对应。
推流。
说明如果指定了录制时间段,在该时间段内如果没有推流,自然不会录制。
限定时间段的配置规则是一次性的,即当指定的时间段过去之后,该规则不会再触发。
按需录制
按需录制的原理是当直播流推流上来之后,直播录制服务会发送一条HTTP回调给您事先设定的后台服务,通过该回调的返回内容决定是否录制这条直播流,并且可以动态的修改录制格式和录制周期。
系统交互如下图所示,您需要开发图中的App业务服务,接收HTTP回调,并根据您自身的业务逻辑决定是否录制。
按需录制可以通过调用API 的方式来实现:
调用接口添加录制配置配置录制规则。其中OnDemand字段填1,表示通过HTTP回调开启按需录制。
调用接口AddLiveRecordNotifyConfig,设置OnDemandUrl字段。
推流。
App业务服务接收到该推流的按需录制回调,根据自身业务决定是否录制,返回内容。
直播录制服务根据按需录制回调返回的结果,启动录制或不启动录制。
涉及的API包括:
API名称 | 描述 |
配置录制规则。 | |
如果不再需要某项规则,可以通过该接口删除。 | |
查询所有配置的规则。 | |
配置某个域名下的录制回调,包括事件回调和按需录制回调。 | |
如果不再需要某个域名的录制回调,可以通过该接口删除。 | |
查询某个域名的录制回调。 | |
更新某个域名的录制回调。 | |
按需录制回调给您的HTTP消息定义。 |
实践示例:
调用AddLiveAppRecordConfig接口,配置指定域名为
example.com
,AppName为liveBucket****
下的所有直播流自动录制:/?AppName=liveApp**** &DomainName=example.com &OssBucket=liveBucket**** &OssEndpoint=oss-cn-shanghai.aliyuncs.com &RecordFormat.1.Format=m3u8 &<公共请求参数>
调用AddLiveRecordNotifyConfig接口,设置OnDemandUrl字段为
http://example.aliyundoc.com
:/?DomainName=example.com &OnDemandUrl=http://example.aliyundoc.com &<公共请求参数>
推流。
App业务服务接收到的按需录制回调为:(详见按需录制回调)
GET /?app=liveApp****&domain=example.com&stream=liveStream****&vbitrate=2000&codec=h264 HTTP/1.1 Host: demo.aliyundoc.com User-Agent: Go-http-client/1.1
根据回调返回的结果:(详见按需录制回调)
如果收到以下结果,则进行录制:
{ "ApiVersion" : "1.0", "NeedRecord" : true }
如果收到以下结果,则不录制:
{ "ApiVersion" : "1.0", "NeedRecord" : false }
如果没有设置OnDemandUrl,就不会有按需录制回调,默认行为是不录制。
在调用AddLiveRecordNotifyConfig接口,设置录制回调前请先调用接口AddLiveAppRecordConfig设置录制规则,否则无法启动录制任务。
手动录制
针对直播录制您还可以直接通过手动的方式实现某条直播流的录制启动。如果某条直播流正在录制,您也可以通过手动的方式停止该直播流的录制。
手动录制通过调用API实现:
调用AddLiveAppRecordConfig接口配置录制规则。设置ondemand=7,表示推流后不自动录制。
推流。
调用RealTimeRecordCommand接口启动录制。
(如果需要)调用RealTimeRecordCommand接口停止录制。
涉及到的API包括:
API名称 | 说明 |
配置自动录制规则。 | |
如果不再需要某项规则,可以通过该接口删除。 | |
查询所有配置的规则。 | |
实时录制命令,可控制手动启动录制和手动停止录制。 |
实践示例:
手动启动录制。
如果直播流
example.com/liveApp****/liveStream****
正在推流,可以按以下方式调用RealTimeRecordCommand接口启动录制:/?AppName=liveApp**** &DomainName=example.com &StreamName=liveStream**** &Command=start &<公共请求参数>
手动停止录制
如果直播流
example.com/liveApp****/liveStream****
正在录制,可以按以下方式调用RealTimeRecordCommand接口停止录制:/?AppName=liveApp**** &DomainName=example.com &StreamName=liveStream**** &Command=stop &<公共请求参数>
如果直播流不存在(没有推流),调用RealTimeRecordCommand接口手动启动录制会返回失败。
手动启动录制的直播流如果发生了断流,就会停止录制,并且重新推流后不会自动启动录制(如果没有配置自动录制)。
录制文件获取
直播录制结束后,可以通过以下方法获取到对应的录制文件:
方法一:通过直播控制台查看录制文件。详细操作,请参见录制文件管理。
方法二:通过调用DescribeLiveStreamRecordIndexFiles查询某个时间段内的所有录制索引文件。需注意接口中的StartTime和EndTime字段填的均是UTC+0时间,请注意和本地时区的对应。例如您本地为北京时间,UTC时间=北京时间-8。
http(s)://live.aliyuncs.com/?Action=DescribeLiveStreamRecordIndexFiles &AppName=liveApp**** &DomainName=example.com &EndTime=2017-12-22T08:00:00Z &StartTime=2017-12-21T08:00:00Z &StreamName=liveStream**** &<公共请求参数>
方法三:通过调用AddLiveRecordNotifyConfig接口设置录制文件生成回调,每当一个录制文件生成,都能收到一个HTTP请求,便于您做一些业务上的实时处理。具体操作如下:
调用AddLiveRecordNotifyConfig接口,设置域名
aliyundoc.com
下直播录制文件生成事件都回调到http://example.aliyundoc.com
这个地址:/?DomainName=aliyundoc.com &NotifyUrl=http://example.aliyundoc.com &<公共请求参数>
设置之后,如果一条直播流
aliyundoc.com/live/teststream
生成录制文件(TS/MP4/FLV),您就会收到以下内容的回调:POST / HTTP/1.1 Host: live.example.com User-Agent: Go-http-client/1.1 { "domain": "aliyundoc.com", "app": "live", "stream": "teststream", "uri": "live/teststream/0_2017-03-08-23:09:46_2017-03-08-23:10:40.flv", "duration": 69.403, "start_time": 1488985786, "stop_time": 1488985840 }
注意事项
如果想知道自动录制(按域名/AppName/StreamName多级别自动录制、按定时任务自动录制)是否生效,可以设置录制回调,详情请参见直播录制回调。
如果希望针对每个录制文件做实时处理,可通过创建录制内容索引文件实现,详情请参见录制内容合并与提取。
录制周期为当前直播转为录制文件后的最大时长,直播时长超过设定的录制周期后,将生成新文件,录制周期支持15-360分钟。可在直播控制台上配置录制模板时进行设置,也可以调用接口AddLiveRecordVodConfig(录制到VOD)或接口AddLiveAppRecordConfig(录制到OSS)进行设置。
如果在一个录制周期内,直播流发生了断流,但是在3分钟内,该直播流又推上来了,那么仍会在同一个录制文件中继续录制,不会生成新的录制文件。这就意味着,一条直播流必须断流超过3分钟,才会生成最后一个录制文件。
视频直播支持触发拉流,当使用触发拉流域名对应的播放地址进行播放时,会自动触发阿里云视频直播服务进行拉流直播,无人播放时则不会回源站进行拉流。自动录制、按需录制、手动录制功能应用在触发拉流场景时,如果触发拉流无人播放,则不会回源站拉流,自动录制、按需录制、手动录制同样也不会进行录制。