直播录制

视频直播录制可对当前直播实时录制并可回放历史直播视频。本文将详细为您介绍视频直播录制功能。

功能介绍

视频直播是通过播放地址以实时流的形式播放推流端的数据,如果想要在直播结束后再次观看或修改直播内容,就必须要使用视频直播的录制功能。

视频直播录制功能,就是将直播中心接收到的推流数据进行录制,保存至您指定的存储位置。目前直播录制存储提供两种方式,录制存储至VOD录制存储至OSS

直播录制的原理

直播录制的过程,是通过拉取您推上来的直播流,将音视频封装成单独的一个个媒体切片(封装格式为TS),然后进行储存。直播录制在工作时遵循以下原则:

  • 直播录制只修改音视频的封装格式(RTMP/FLV转成TS),绝不修改音视频内容(即编码层内容)。举个例子,如果您推上来的直播流是花屏的,那录制下来的也是花屏的。

  • 直播录制有权限往用户储存地址写入录制文件,但是不会也没有权限修改/删除用户储存地址的任务文件(包括已写入的录制文件)。用户储存地址中的录制文件,完全由您自己管理。

功能对比

录制存储至VOD和录制存储至OSS都可以对直播内容进行录制存储。两者使用场景有所不同,您可以根据您自己的业务决定具体采用哪种方式进行存储。

存储方式

关联产品服务

封装格式

适用场景

录制存储至VOD

开通视频点播服务

TS/M3U8

倾向于对录制内容进行二次生产,注重录制内容后期处理,如剪辑,播放,设置录制视频封面等。

录制存储至OSS

开通OSS服务

  • TS/M3U8

  • MP4

  • FLV

  • CMAF

    说明

    不管是哪种封装格式,直播录制都会先将直播流切片成一个个的TS切片,然后再合成对应封装格式的录制文件。

倾向于录制内容管理,注重存储。

说明

同一个直播流不能同时配置两种存储方式。

限制条件

音视频编码格式

由于直播录制需要先将直播流切分成TS文件,因此您推上来的直播流的音视频编码格式必须满足TS封装格式的要求。根据FLV标准和ISO/IEC 13818-1标准,直播录制目前仅支持以下编码格式:

  • 视频:H264、HEVC、MPEG4

  • 音频:AAC、MP3

说明

如果直播流包含了非以上格式编码的音视频,直播录制可能会出现:无法生成录制文件、录制黑屏、录制没有声音,以及其他一些无法预见的异常情况。

异常的直播流

对于正常的直播流(没有不支持的编码格式、帧率稳定、时间戳单调线性增长),直播录制均能正常生成录制文件。当然,对于偶尔帧率不稳定,时间戳跳变的流,直播录制也能做出一定的兼容,保证录制文件的正常生成。但是如果推上来的直播流存在严重异常(长时间没有视频帧,时间戳增长没有规律,音视频头缺失等等),直播录制可能无法保证正常生成录制文件。

录制存储至VOD

前置条件

若采用录制存储至VOD方式进行直播录制功能配置,需要开通视频点播服务启用点播系统Bucket

重要
  • 录制文件存储在视频点播VOD中,会产生存储费用,在VOD中计费请参见点播基础服务计费

  • 在启用点播系统Bucket时,需要注意点播系统Bucket需要与待配置域名的直播中心同地域。

  • 使用金融云账号不支持视频直播录制到点播。

功能配置

完成前置条件相关内容之后,就可以进行录制存储至VOD配置。

视频直播目前提供两种方式添加录制存储至VOD配置。

一,通过控制台操作,具体操作请参见操作指南录制存储至VOD

二,通过调用AddLiveRecordVodConfig - 添加直播录制转点播配置API配置。

添加直播录制转点播配置Java 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 dddLiveRecordVodConfigResponse = null;
try {
    dddLiveRecordVodConfigResponse = client.getAcsResponse(addLiveRecordVodConfigRequest);
} catch (ClientException e) {
    e.printStackTrace();
}
 System.out.println(new Gson().toJson(dddLiveRecordVodConfigResponse));

说明
  • 以上示例代码表示,对<DomainName>域名进行录制存储至VOD配置,AppName为<AppName>,StreamName为<StreamName>。录制内容不进行转码(VOD_NO_TRANSCODE),存储至点播系统Bucket<StorageLocation>。

  • AppName和StreamName可以填为*,表示所有AppName和所有StreamName(即不限制AppName或StreamName)。

  • 可以配置多条规则,规则匹配时存在优先级:

    • AppName(不为*)、StreamName(不为*)的优先级最高。

    • AppName(不为*)的优先级次之。

    • AppName为*(即只限定域名)的优先级最低。

重要
  • 完成配置后重新推流录制配置才会生效。

  • 断流180秒后生成录制文件。

录制内容转码

录制存储至VOD文件格式为m3u8,如果想存储其他格式可以通过转码配置实现。配置录制转码示例代码如下:

 addLiveRecordVodConfigRequest.setVodTranscodeGroupId("<TranscodeGroupId>");
说明
  • 转码模板需要在点播系统进行配置,具体操作请参见点播配置普通转码模板

  • <TranscodeGroupId>为点播系统配置的转码模板组ID

  • 配置转码后,会对录制文件进行转码(原文件仍然保留),生成转码地址。

录制内容合并

录制内容合并目前分为两种形式:

1,同一路流断流180秒以内再次推流,录制内容会自动合并成一个录制文件。

2,推流时长超过录制周期之后的文件合并。在推流时长超过录制周期之后,会生成一个新的录制文件(假设设置录制周期5分钟,推流时长8分钟,一次推流将会产生两个录制文件)。

设置录制周期时长示例代码如下:

//单位秒,取值范围(300~21600),默认值900
addLiveRecordVodConfigRequest.setCycleDuration(<300>);

如果需要将多个录制周期的文件进行合并,可以进行合并配置。

重要

开启多录制周期合并,会使用视频点播服务的基础剪辑合成功能和转码功能。计费详情参见 增值服务计费以及基础服务计费

配置录制文件合并示例代码如下:

addLiveRecordVodConfigRequest.setAutoCompose("ON");
addLiveRecordVodConfigRequest.setComposeVodTranscodeGroupId("<TranscodeGroupId>");
说明
  • 合并之后会产生一个新的文件,原录制文件仍然保留。

  • 转码模板需要在点播系统进行配置,具体操作请参见点播配置普通转码模板

  • <TranscodeGroupId>为点播系统配置的转码模板组ID

录制文件管理

目前可以通过视频直播控制台查看存储至VOD的录制文件,详情可参见在视频直播控制台查看录制文件。若要对录制文件进行管理请通过视频点播进行,详情请参见视频点播媒体管理

录制存储至OSS

前置条件

若采用录制存储至OSS方式进行直播录制功能配置,需要开通OSS服务以及创建Bucket,具体操作请参见配置OSS

重要
  • 录制文件存储在OSS中,会产生存储费用,在OSS中计费请参见存储费用

  • OssBucket需要与待配置域名的直播中心同地域。

功能配置

完成前置条件相关内容之后,就可以进行录制存储至OSS配置。

视频直播目前提供两种方式添加录制存储至OSS配置。

一,通过控制台操作,具体操作请参见操作指南录制存储至OSS

二,通过调用AddLiveAppRecordConfig - 添加录制配置API配置。

添加录制配置Java 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>中。

  • OssObjectPrefix与SliceOssObjectPrefix长度不超过255字符(匹配变量后),具体支持变量请参见AddLiveAppRecordConfig - 添加录制配置API说明。

  • <OssEndpoint>可通过<OssBucket>所属地域在OSS访问域名和数据中心进行查看。

  • AppName和StreamName可以填为*,表示所有AppName和所有StreamName(即不限制AppName或StreamName)。

  • 可以配置多条规则,规则匹配时存在优先级:

    • AppName(不为*)、StreamName(不为*)的优先级最高。

    • AppName(不为*)的优先级次之。

    • AppName为*(即只限定域名)的优先级最低。

重要
  • 完成配置后重新推流录制配置才会生效。

  • 断流180秒(该时间可以设置,详见断流拼接)后生成录制文件。

录制转码流

如果希望在存储录制内容时减少录制文件体积,可通过录制转码流实现(在保证画质质量的前提下,调整视频码率、提高视频压缩率、减小文件体积)。录制存储至OSS功能支持同时存储转码流与原始流,也支持仅存储转码流或原始流。

重要

使用直播转码功能会产生转码费用,按转码标准、分辨率规格及对应总转码时长计费。计费规则详见直播转码费用

配置录制转码流示例代码>>>

        //需要将<>内容替换成实际使用的值        
        List<AddLiveAppRecordConfigRequest.TranscodeRecordFormat> transcodeFormatList=new ArrayList<AddLiveAppRecordConfigRequest.TranscodeRecordFormat>();
        AddLiveAppRecordConfigRequest.TranscodeRecordFormat m3u8TranscodeFormat=new AddLiveAppRecordConfigRequest.TranscodeRecordFormat();
        m3u8TranscodeFormat.setFormat("m3u8");
        //转码流录制OSS存储的录制文件名
        m3u8TranscodeFormat.setOssObjectPrefix("<transcodeRecord/{AppName}/{StreamName}/{EscapedStartTime}_{EscapedEndTime}>");
        //转码流录制切片名称
        m3u8TranscodeFormat.setSliceOssObjectPrefix("<transcodeRecord/{AppName}/{StreamName}/{UnixTimestamp}_{Sequence}>");
        transcodeFormatList.add(m3u8TranscodeFormat);
        addLiveAppRecordConfigRequest.setTranscodeRecordFormats(transcodeFormatList);
        List<String> transcodeTemplateList=new ArrayList<String>();
        //转码模板ID
        transcodeTemplateList.add("<lld>");
        addLiveAppRecordConfigRequest.setTranscodeTemplatess(transcodeTemplateList);
说明
  • 若仅需录制转码流,则可以不设置原始流(setRecordFormats)。

  • 设置录制转码流(setTranscodeRecordFormats)时,需同时指定转码模板ID(setTranscodeTemplatess),转码模板需要进行配置,具体操作请参见直播转码

  • 录制转码流需要在配置转码模板时,将转码配置为推流触发

  • 转码流录制文件名StreamName会转换成StreamName_转码模板ID的形式。

断流拼接

同一路流断流在断流拼接时长(默认180秒)以内再次推流,录制内容会自动合并成一个录制文件。

说明

因需等待断流拼接,所以才会在断流拼接时长之后生成录制文件。

您可以根据您实际的业务调整断流拼接时长,设置断流拼接时长:

//单位秒,取值范围(15~21600)
addLiveAppRecordConfigRequest.setDelayTime(<180>);

不建议调整为过短或过长的时间。若生成录制文件的时间设置过短,由于网络波动,断流重推等原因,就会生成大量的录制文件。若设置过长则会导致录制文件在直播结束(断流)之后很长时间才能看到。

在一些特定的业务场景中,您可能完全不希望等待断流拼接,而希望在直播结束后立即生成录制文件,这种情况也是可以实现的。您可以给推流设置回调事件(设置推流回调事件请参见直播推流状态回调),在接收到推流结束通知时通过调用 RealTimeRecordCommand - 实时录制指令API做到取消断流拼接。

取消断流拼接示例代码>>>

        //需要将<>内容替换成实际使用的值
        RealTimeRecordCommandRequest realTimeRecordCommandRequest=new RealTimeRecordCommandRequest();
        realTimeRecordCommandRequest.setCommand("cancel_delay");
        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));
说明
  • 如果录制的是转码流,此处需要将<StreamName>设置成StreamName_转码模板ID的形式。

  • setCommand("cancel_delay") 即表示重置断流延迟时间,完全停止录制,立刻生成录制文件。

自定义录制策略

功能配置中,我们进行了直播录制功能的配置,在直播推流时即会开始对直播内容进行录制,我们称其为自动录制

但有些时候,我们希望能够通过业务决策自主决定是否需要对某一次直播内容进行录制。直播录制功能提供了解决这类问题的方法,自主决定录制分为两种情况:

一,由直播服务询问您的业务系统是否需要对该直播内容进行录制,得到响应需要录制后再进行录制,我们称其为按需录制

二,由您的业务系统给直播服务发出通知对直播内容进行录制,我们称其为手动录制

按需录制

实现按需录制,需要您业务系统提供直播服务调用的URL地址,具体说明可参见按需录制回调

设置录制功能按需录制示例代码如下:

        //OnDemand字段填1,表示通过HTTP回调开启按需录制。
        addLiveAppRecordConfigRequest.setOnDemand(1);

同时调用 AddLiveRecordNotifyConfig - 添加域名级别录制回调配置API进行录制回调配置。

添加录制回调配置示例代码>>>

        //需要将<>内容替换成实际使用的值
        AddLiveRecordNotifyConfigRequest addLiveRecordNotifyConfigRequest=new AddLiveRecordNotifyConfigRequest();
        //设置按需录制回调请求URL地址
        addLiveRecordNotifyConfigRequest.setOnDemandUrl("<OnDemandUrl>");
        addLiveRecordNotifyConfigRequest.setNotifyUrl("<NotifyUrl>");
        addLiveRecordNotifyConfigRequest.setDomainName("<DomainName>");
        AddLiveRecordNotifyConfigResponse addLiveRecordNotifyConfigResponse = null;
        try {
            addLiveRecordNotifyConfigResponse = client.getAcsResponse(addLiveRecordNotifyConfigRequest);
        } catch (ClientException e) {
            e.printStackTrace();
        }
        System.out.println(new Gson().toJson(addLiveRecordNotifyConfigResponse));
重要
  • <OnDemandUrl>为按需录制回调请求URL地址,<NotifyUrl>为录制回调(包括录制事件和状态回调) URL地址。

  • 因接口<NotifyUrl>参数不能为空,所以必须要设置<NotifyUrl>,如果您只需要接收按需录制请求,不需要录制事件和录制状态回调,可以配置<NotifyUrl>为一个没有方法实现的URL地址。

手动录制

实现手动录制,需要将自动录制功能关闭。示例代码如下:

        //OnDemand字段填7,表示不进行自动录制。
        addLiveAppRecordConfigRequest.setOnDemand(7);

然后在直播的过程中,您可以根据业务情况通过调用 RealTimeRecordCommand - 实时录制指令API开启录制。

开启录制示例代码>>>

        //需要将<>内容替换成实际使用的值 
        RealTimeRecordCommandRequest realTimeRecordCommandRequest=new RealTimeRecordCommandRequest();
        realTimeRecordCommandRequest.setCommand("start");
        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));
说明
  • 如果录制的是转码流,此处需要将<StreamName>设置成StreamName_转码模板ID的形式。

  • setCommand("start")表示启动录制。

停止录制

无论是自动录制按需录制手动录制,都可以调用 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的形式。

相关API

录制周期配置

直播时长超过设定的录制周期后,将生成新文件(例如直播20分钟,录制周期设置为15分钟,将会生成两个录制文件),录制周期支持15-360分钟

设置录制周期示例代码>>>

        List<AddLiveAppRecordConfigRequest.RecordFormat> formatList=new ArrayList<AddLiveAppRecordConfigRequest.RecordFormat>();
        AddLiveAppRecordConfigRequest.RecordFormat m3u8Format=new AddLiveAppRecordConfigRequest.RecordFormat();
        m3u8Format.setFormat("m3u8");
        m3u8Format.setOssObjectPrefix("<record/{AppName}/{StreamName}/{EscapedStartTime}_{EscapedEndTime}>");
        m3u8Format.setSliceOssObjectPrefix("<record/{AppName}/{StreamName}/{UnixTimestamp}_{Sequence}>");
       //设置录制周期,单位秒
        m3u8Format.setCycleDuration(<900>);
        AddLiveAppRecordConfigRequest.RecordFormat mp4Format=new AddLiveAppRecordConfigRequest.RecordFormat();
        mp4Format.setFormat("mp4");
        mp4Format.setOssObjectPrefix("<record/{AppName}/{StreamName}/{EscapedStartTime}_{EscapedEndTime}>");
        //设置录制周期,单位秒
        mp4Format.setCycleDuration(<1500>);
        formatList.add(mp4Format);
        formatList.add(m3u8Format);
        addLiveAppRecordConfigRequest.setRecordFormats(formatList);
说明

注意在以上示例中,同时配置了两种存储格式,分别设置了录制周期。按照此设置进行推流20分钟,将会生成3个录制文件(一个mp4,两个m3u8)。

在直播未超过录制周期的情况下,录制文件一般在直播结束后生成。若是您的业务需要在直播未结束的情况下查看录制文件,可以通过调用 RealTimeRecordCommand - 实时录制指令API刷新录制内容,强制重新开始录制,如果restart之前在录制,会立即生成录制文件。

重新开始录制示例代码>>>

        //需要将<>内容替换成实际使用的值 
        RealTimeRecordCommandRequest realTimeRecordCommandRequest=new RealTimeRecordCommandRequest();
        realTimeRecordCommandRequest.setCommand("restart");
        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("restart")表示重新开始录制。

  • 如果录制的是转码流,此处需要将<StreamName>设置成StreamName_转码模板ID的形式。

  • 若您的直播流录制配置了多种存储格式,此操作会将多种存储格式一起刷新。

录制内容合并与提取

视频直播支持通过创建索引文件将录制内容按照时间段提取出文件,也可以将起止时间段内的多个录制文件内容合并为一个。

说明
  • 无论录制内容最终保存成哪种格式,直播录制都会先将直播流切片成一个个的TS切片,然后再合成对应封装格式的录制文件。通过此特性,可以自主创建M3U8索引文件,将TS切片文件进行组合,从而实现录制内容的合并与提取。

  • 录制内容需要包含M3U8存储格式才能够进行合并或提取。

调用CreateLiveStreamRecordIndexFiles - 创建录制索引文件API创建录制内容索引文件。

创建录制内容索引文件示例代码>>>

        CreateLiveStreamRecordIndexFilesRequest createLiveStreamRecordIndexFilesRequest=new CreateLiveStreamRecordIndexFilesRequest();
        createLiveStreamRecordIndexFilesRequest.setAppName("<AppName>");
        createLiveStreamRecordIndexFilesRequest.setStreamName("<StreamName>");
        createLiveStreamRecordIndexFilesRequest.setDomainName("<DomainName>");
        createLiveStreamRecordIndexFilesRequest.setOssEndpoint("<OssEndpoint>");
        createLiveStreamRecordIndexFilesRequest.setOssBucket("<OssBucket>");
        createLiveStreamRecordIndexFilesRequest.setStartTime("<StartTime>");
        createLiveStreamRecordIndexFilesRequest.setEndTime("<EndTime>");
        createLiveStreamRecordIndexFilesRequest.setOssObject("<IndexFiles/OssObject.m3u8>");
        CreateLiveStreamRecordIndexFilesResponse createLiveStreamRecordIndexFilesResponse = null;
        try {
            createLiveStreamRecordIndexFilesResponse = client.getAcsResponse(createLiveStreamRecordIndexFilesRequest);
        } catch (ClientException e) {
            e.printStackTrace();
        }
        System.out.println(new Gson().toJson(createLiveStreamRecordIndexFilesResponse));
说明
  • 以上示例表示,将直播流<AppName> <StreamName>的录制内容,按照起止时间<StartTime>至<EndTime>创建出一个新的索引文件。存储至<OssEndpoint>的<OssBucket>中,索引文件名为<IndexFiles/OssObject.m3u8>。

  • <StartTime>至<EndTime>格式为:yyyy-MM-ddTHH:mm:ssZ(UTC时间)。

重要
  • 创建录制索引必保证直播流发生过推流行为,如果设置的时间内未发生过直播或直播流名称错误等会导致创建录制索引失败。

  • 录制内容分为文件信息(包含AppName,StreamName,OSS存储路径等)和文件。文件信息(TS分片文件信息和创建的M3U8索引文件信息)保存在视频直播中,文件(TS分片文件和M3U8索引文件)保存在OSS中。

  • 存储在OSS中的文件保存时间由OSS的存储配置决定。

  • TS分片文件信息在视频直播系统中仅保存3个月,创建M3U8索引文件只能选择最近3个月的录制内容。

  • M3U8索引文件信息在视频直播系统中仅保存6个月,若要查询仅能查询6个月内创建的索引文件的信息。

  • 如要合并或提取转码流,需要将StreamName设置成StreamName_转码模板ID的形式。

  • <OssBucket>需要与直播中心同地域,否则无法通过域名查询到创建的M3U8索引文件信息。

相关API

录制文件管理

视频直播支持两种方式进行录制文件管理:

1,通过控制台操作,详情请参见控制台操作指南录制文件管理

2,通过调用API进行操作。接下来将通过示例介绍如何通过Java SDK对录制文件进行删除。

删除录制文件Java SDK实现过程>>>

  1. 查询录制文件信息。

    说明

    目前删除录制文件需要指定索引文件ID,所以需要先查询出录制文件信息获取到索引文件ID再进行删除。

            //需要将<>内容替换成实际使用的值 
            DefaultProfile profile = DefaultProfile.getProfile("<regionId>", "<ALIBABA_CLOUD_ACCESS_KEY_ID>", "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>");
            IAcsClient client = new DefaultAcsClient(profile);
            DescribeLiveStreamRecordIndexFilesRequest describeLiveStreamRecordIndexFilesRequest=new DescribeLiveStreamRecordIndexFilesRequest();
            describeLiveStreamRecordIndexFilesRequest.setAppName("<AppName>");
            describeLiveStreamRecordIndexFilesRequest.setStreamName("<StreamName>");
            describeLiveStreamRecordIndexFilesRequest.setDomainName("<DomainName>");
            describeLiveStreamRecordIndexFilesRequest.setStartTime("<StartTime>");
            describeLiveStreamRecordIndexFilesRequest.setEndTime("<EndTime>");
            DescribeLiveStreamRecordIndexFilesResponse describeLiveStreamRecordIndexFilesResponse = null;
            try {
                describeLiveStreamRecordIndexFilesResponse = client.getAcsResponse(describeLiveStreamRecordIndexFilesRequest);
            } catch (ClientException e) {
                e.printStackTrace();
            }
    
            for(int i=0;i<describeLiveStreamRecordIndexFilesResponse.getRecordIndexInfoList().size();i++){
                System.out.println(new Gson().toJson(describeLiveStreamRecordIndexFilesResponse.getRecordIndexInfoList().get(i)));
    
            }
    重要
  2. 删除录制文件。

    说明

    删除录制文件时如果需要同步删除储存在OSS中的文件(视频直播储存的是录制文件信息,如AppName,StreamName,OSS文件储存路径等,文件是储存在OSS中),则需要创建服务角色AliyunMTSVideoLifecycleRole,并精确授权AliyunMTSVideoLifecycleRolePolicy系统策略,具体操作可参见在视频直播控制台删除录制文件

            DeleteLiveStreamRecordIndexFilesRequest deleteLiveStreamRecordIndexFilesRequest=new DeleteLiveStreamRecordIndexFilesRequest();
            deleteLiveStreamRecordIndexFilesRequest.setAppName("<AppName>");
            deleteLiveStreamRecordIndexFilesRequest.setStreamName("<StreamName>");
            deleteLiveStreamRecordIndexFilesRequest.setDomainName("<DomainName>");
    
            List<String> recordList=new ArrayList<>();
            //添加索引文件ID
            recordList.add("<recordId>");
            deleteLiveStreamRecordIndexFilesRequest.setRecordIds(recordList);
            deleteLiveStreamRecordIndexFilesRequest.setRemoveFile("<true>");
            DeleteLiveStreamRecordIndexFilesResponse deleteLiveStreamRecordIndexFilesResponse = null;
            try {
                deleteLiveStreamRecordIndexFilesResponse = client.getAcsResponse(deleteLiveStreamRecordIndexFilesRequest);
            } catch (ClientException e) {
                e.printStackTrace();
            }
    
            System.out.println(new Gson().toJson(deleteLiveStreamRecordIndexFilesResponse));
    重要

其他删除文件方法

删除超过6个月的文件:由于只能查询6个月以内的录制文件信息,若要删除超过6个月的文件请通过OSS进行,详情请参见OSS删除文件

过期删除录制文件:由于媒体资源均存放在OSS的Bucket中,需要授权访问才能正常删除录制文件,您可以点击授权进行一键授权。授权后,再提交工单申请,我们会在后台为您配置您需要的过期时间。关于如何提交工单,请参见联系我们。配置过期时间后,录制文件过期删除功能授权操作即为完成。

说明

云资源访问授权是对系统创建,供视频直播使用授予访问云资源权限的角色。授权后如果误删角色,可进行重新授权。

相关文档

使用Java SDK,可参见Java SDK使用说明

更多录制回调功能使用,可参见直播录制回调以及按需录制回调