直播录制

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

功能介绍

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

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

  1. 登录视频直播控制台
  2. 在左侧导航栏选择功能管理>直播录制,进入直播录制页面,选择存储至VOD配置页签。

  3. 选择待配置的播流域名。

  4. 单击添加

  5. 配置录制模板。

    image

    录制模板参数及说明如下表所示。

    参数

    描述

    AppName

    视频的应用名称,输入的AppName必须与直播推流的AppName保持一致,方可生效。如果您想要进行域名级别录制,输入星号(*)即可。

    StreamName

    存储至VOD支持流级别的录制。您只需输入指定的流名称即可。如果您想要进行全部流录制,即该AppName下的流全部录制,输入星号(*)即可。

    说明

    AppNameStreamName参数支持英文、数字、“-”、“_”符号,长度限制在255个字符以内。

    存储地址

    选择存储位置。

    录制周期

    录制周期范围为15~360分钟,最大支持 6 小时录制。超过 6 小时,系统将按照录制命名规则生成新文件。ts切片时长默认为 30s。

    说明

    录制周期为当前直播转为点播文件后的最大时长。

    录制转码模板

    从列表中选择存储转码规则,可以在点播服务中对录制的视频进行转码处理。

    存储转码规则设置是将录制下来的视频转换为可供传播的点播文件格式。可转码为不同规格的视频,也可以不转码即保持原画格式。

    录制转码模板具体操作,请参见视频点播转码配置

    说明

    视频点播转码模板所在区域需与您当前域名所在区域保持一致。例如:当前域名为华东2区,视频点播转码模板区域也需要在华东2区。

    自动合并开关

    开启后可在直播录制结束后自动将多个录制周期文件合并成一个录制文件存储到VOD中。

    说明

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

    自定合并转码模板

    从列表中选择存储转码规则,对自动合成出来的视频在点播服务中进行一次转码,录制转码规则从当前点播系统中获取。自动合并转码模板具体操作,请参见转码模板

    说明

    视频点播转码模板所在区域需与您当前域名所在区域保持一致。例如:当前域名为华东2区,视频点播转码模板区域也需要在华东2区。

  6. 单击确定

API配置录制存储至VOD

//需要将<>内容替换成实际使用的值
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为*(即只限定域名)的优先级最低。

  • 更多参数说明请参见AddLiveRecordVodConfig - 添加直播录制转点播配置

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

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

录制内容转码

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

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

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

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

录制内容合并

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

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

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

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

    重要

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

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

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

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

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

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

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

录制文件管理

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

在视频直播控制台查看存储至VOD录制文件

  1. 登录视频直播控制台
  2. 在左侧导航栏选择功能管理>直播录制,进入直播录制页面,选择录制管理文件页签。

  3. 选择配置的播流域名。

  4. 单击存储至VOD页签。

    image

录制存储至OSS

前置条件

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

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

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

功能配置

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

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

控制台配置录制存储至OSS

  1. 登录视频直播控制台
  2. 在左侧导航栏选择功能管理>直播录制,进入直播录制页面,选择存储至OSS配置页签。

  3. 选择待配置的播流域名。

  4. 单击添加

  5. 配置录制模板。

    image

    表 1. 录制模板参数

    参数

    描述

    AppName

    视频的应用名称,输入的AppName必须与直播推流地址的AppName保持一致,方可生效。如果您想要进行域名级别录制,输入星号(*)可。

    StreamName

    存储至OSS支持流级别的录制。您只需输入指定的流名称即可。如果您想要进行全部流录制,即该AppName下的流全部录制,输入星号(*)可。

    说明
    • AppNameStreamName参数支持英文、数字、短划线(-)、下划线(_)符号,长度限制在255字符以内。

    • AppNameStreamName参数如果使用(*)号需注意

      • (*)号不能匹配任意字符串,只能通配当前已有的应用名称或流名称。

      • (*)号无法在字符串中进行通配。

    存储位置

    选择存储位置。

    说明

    存储Bucket列表中包含标准Bucket和媒体Bucket。标准Bucket是OSS Bucket,用于存储。媒体Bucket是MPS定制的Bucket,存入媒体Bucket中的视频,可执行MPS转码任务。目前Bucket列表中,未对Bucket做区分。如果您需要将视频转成媒体文件,需要自行记住对应的媒体Bucket的名称,方便您后期视频转成媒体文件存储位置的选择。

    断流拼接时长

    直播断流时长超过设定的拼接时长后,将会生成新文件,断流拼接时长支持15~21600秒。

    存储格式

    支持flvm3u8mp4cmaf四种格式。

    说明

    至少配置一个存储格式,其中CMAF格式不能与M3U8格式同时选择。

    存储规则

    默认的存储路径为

    • M3U8:record/{AppName}/{StreamName}/{EscapedStartTime }_{EscapedEndTime }

    • TS:record/{AppName}/{StreamName}/{UnixTimestamp}_{Sequence}

    • FMP4:record/{AppName}/{StreamName}/{UnixTimestamp}_{Sequence}

    • MP4:record/{AppName}/{StreamName}/{EscapedStartTime }_{EscapedEndTime }

    • FLV:record/{AppName}/{StreamName}/{EscapedStartTime }_{EscapedEndTime }

    示例

    AppNameliveApp****StreamNameliveStream****,当录制m3u8格式的存储路径为record/liveApp****/liveStream****/{EscapedStartTime}_{EscapedEndTime }

    单个TS时长

    单个切片时长,默认为30秒。支持单个TS时长范围5~30秒。

    录制周期

    录制周期范围为15分钟~360分钟,最大支持6小时录制。超过6小时,系统将按照录制命名规则生成新文件。

    说明

    录制周期为当前直播转为点播文件后的最大时长。

    image

    表 2. 录制转码流参数

    参数

    描述

    录制转码流

    打开录制转码流开关,配置参数。

    存储格式

    支持flvm3u8mp4cmaf四种格式。

    说明

    至少配置一个存储格式,其中CMAF格式不能与M3U8格式同时选择。

    存储规则

    默认的存储路径为

    • M3U8:transcodeRecord/{AppName}/{StreamName}/{EscapedStartTime }_{EscapedEndTime }

    • TS:transcodeRecord/{AppName}/{StreamName}/{UnixTimestamp}_{Sequence}

    • FMP4:transcodeRecord/{AppName}/{StreamName}/{UnixTimestamp}_{Sequence}

    • MP4:transcodeRecord/{AppName}/{StreamName}/{EscapedStartTime }_{EscapedEndTime }

    • FLV:transcodeRecord/{AppName}/{StreamName}/{EscapedStartTime }_{EscapedEndTime }

    示例

    AppNameliveApp****StreamNameliveStream****转码模板ID为lld,当录制m3u8格式的实际存储路径为transcodeRecord/liveApp****/liveStream****_lld/{EscapedStartTime}_{EscapedEndTime }

    单个TS时长

    单个切片时长,默认为30秒。支持单个TS时长5~30秒。

    录制周期

    录制周期范围为15分钟~360分钟,最大支持6小时录制。超过6小时,系统将按照录制命名规则生成新文件。

    说明

    录制周期为当前直播转为点播文件后的最大时长。

    转码模板ID

    支持选择指定转码模板(上限10个)或全部转码模板。

    转码模板所属AppName需和录制模板保持一致才可生效,若无转码模板,请先添加转码模板,请参见通用转码

  6. 单击确定

API配置录制存储至OSS

        //需要将<>内容替换成实际使用的值
        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字符(匹配变量后),具体支持变量请参见APIAddLiveAppRecordConfig - 添加录制配置说明。

  • <OssEndpoint>可通过<OssBucket>所属地域在OSSOSS地域和访问域名进行查看。

  • 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. 在左侧导航栏选择功能管理>直播录制,进入直播录制页面,选择录制管理文件页签。

  3. 选择待配置的播流域名。

  4. 单击存储至OSS页签。

    image

API查看录制文件

        //需要将<>内容替换成实际使用的值 
        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)));

        }
重要

OSS查看录制文件

在配置录制功能时,您已指定了录制文件在OSS中的存储地址。如果需要在OSS中查看录制文件,可参见OSS列举文件

删除录制文件

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

详细授权过程

在直播控制台删除录制文件时需要先进行授权,您需要按照如下步骤在RAM控制台创建并授权RAM角色后,再登录直播控制台删除录制文件。

  1. 使用阿里云账号登录RAM控制台

  2. 在左侧导航栏,选择身份管理 > 角色

  3. 角色页面,单击创建角色

  4. 选择类型页签,可信实体类型选择阿里云服务,单击下一步image

  5. 配置角色页签,请按照以下参数配置:

    • 角色类型:普通服务角色

    • 角色名称:AliyunMTSVideoLifecycleRole

    • 备注:该参数为可选,您可以按照需求自定义填写。

    • 选择受信服务:多媒体转码服务

    配置完成后,单击完成image

  6. 创建完成页签,提示角色创建成功后,单击精确授权

  7. 添加权限页签,请按照以下参数配置:

    • 选择权限类型:系统策略

    • 输入策略名称:AliyunMTSVideoLifecycleRolePolicy

    配置完成后,单击确定image

目前有三种方式进行录制文件删除。

控制台删除录制文件

  1. 登录视频直播控制台
  2. 在左侧导航栏选择录制文件管理

  3. 选择待删除录制文件的域名。

  4. 单击存储至OSS页签,选择删除

    删除录制文件

  5. 单击确定

    同步删除选项默认不选中。若选中此选项,则在删除视频直播控制台上录制文件记录时会同步删除OSS中的录制文件。确定删除

API删除录制文件

        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));
重要

OSS删除录制文件

一般情况下,不建议您直接删除存储在OSS中的录制文件。如果需要删除存储在OSS中的录制文件,可以通过视频直播删除录制文件时同步删除存储在OSS中的文件。如果您因为业务需求需要直接删除存储在OSS中的录制文件,可参考文档OSS删除文件

其他删除文件方法

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

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

说明

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

相关文档

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

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