直播截图

直播截图提供实时截图功能,满足您在观看直播同时的截图需求。本文详细为您介绍视频直播截图功能。

前提条件

视频直播截图功能需要将截图文件存放在Bucket中,因此需要开通OSS服务并且拥有至少一个Bucket用于存储这些截图文件。更多详情,请参见开通OSS服务创建存储空间

重要

Bucket必须与播流域名的直播中心同地域,不支持跨地域截图。

直播截图规则

  • 直播截图是针对推流的AppName为粒度设置的。您可以设置某个AppName下所有推流的截图规则。

    说明

    如果设置AppName为星号(*),则表示截图规则适用于该直播域名下的所有推流。

  • 直播截图功能配置时,可以定义覆盖截图和实时截图两种类型。

    • 覆盖截图是每次新生成截图覆盖之前生成的截图文件。

    • 实时截图是每次新生成的截图不覆盖之前生成的截图文件,截图递增存储。

    • 目前直播截图仅支持生成JPG格式。

      说明

      两种类型可同时设置,且必须设置其中之一。

直播截图功能介绍

说明

新配置的截图模板对正在进行的直播流不生效,需要重新推流才生效。

视频截图功能配置

配置视频直播截图功能可以通过以下两种方法:

  1. 通过控制台配置。具体操作,请参见控制台操作指南配置截图

  2. 通过API配置。以下示例代码通过调用AddLiveAppSnapshotConfig进行添加截图配置

//需要将<>内容替换成实际使用的值
DefaultProfile profile = DefaultProfile.getProfile("<regionId>", "<ALIBABA_CLOUD_ACCESS_KEY_ID>", "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>");
IAcsClient client = new DefaultAcsClient(profile);
AddLiveAppSnapshotConfigRequest addLiveAppSnapshotConfigRequest = new AddLiveAppSnapshotConfigRequest();
addLiveAppSnapshotConfigRequest.setDomainName("<DomainName>");
addLiveAppSnapshotConfigRequest.setAppName("<AppName>");
//截图周期,取值(5-3600)
addLiveAppSnapshotConfigRequest.setTimeInterval(5);
addLiveAppSnapshotConfigRequest.setOssEndpoint("<Endpoint>");
addLiveAppSnapshotConfigRequest.setOssBucket("<BucketName>");
//定义覆盖截图存储文件名(小于256 Byte,支持变量匹配,包含{AppName}、{StreamName})
addLiveAppSnapshotConfigRequest.setOverwriteOssObject("<{AppName}/{StreamName}.jpg>");
//定义实时截图存储文件名(小于256 Byte,支持变量匹配,包含{AppName}、{StreamName}、{UnixTimestamp}、{Sequence},其中 {UnixTimestamp}、{Sequence} 必填一个)
addLiveAppSnapshotConfigRequest.setSequenceOssObject("<{AppName}/{StreamName}/{UnixTimestamp}.jpg>");
try {
    AddLiveAppSnapshotConfigResponse addLiveAppSnapshotConfigResponse = client.getAcsResponse(addLiveAppSnapshotConfigRequest);
    System.out.println(addLiveAppSnapshotConfigResponse.getRequestId());
    // todo something.
} catch (ServerException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (ClientException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}          
说明
  • 配置成功后,重新推流将会产生截图文件。截图文件将会储存至OSS的<BucketName>中,由于同时配置了覆盖截图实时截图文件路径,将会同时产生覆盖截图文件和实时截图文件。覆盖截图文件储存路径为<{AppName}/{StreamName}.jpg>。实时截图文件储存路径为<{AppName}/{StreamName}/{UnixTimestamp}.jpg>。

  • 若对覆盖截图和实时截图的区别还不了解,请参见文档开头部分直播截图规则

视频截图管理

视频直播支持两种方式进行截图管理:

1,通过控制台操作,详情请参见控制台操作指南截图管理

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

通过Java SDK对截图文件进行删除的实现过程如下:

  1. 查询截图文件内容。

    说明

    目前删除截图文件需要指定截图文件时间戳,所以需要先查询出截图文件内容获取到截图文件时间戳再进行删除。

    //需要将<>内容替换成实际使用的值 
    DefaultProfile profile = DefaultProfile.getProfile("<regionId>", "<ALIBABA_CLOUD_ACCESS_KEY_ID>", "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>");
    IAcsClient client = new DefaultAcsClient(profile);
    DescribeLiveStreamSnapshotInfoRequest describeLiveStreamSnapshotInfoRequest=new DescribeLiveStreamSnapshotInfoRequest();
    describeLiveStreamSnapshotInfoRequest.setAppName("<AppName>");
    describeLiveStreamSnapshotInfoRequest.setStreamName("<StreamName>");
    describeLiveStreamSnapshotInfoRequest.setDomainName("<DomainName>");
    //UTC时间,格式为:yyyy-MM-ddTHH:mm:ssZ
    describeLiveStreamSnapshotInfoRequest.setStartTime("<StartTime>");
    //UTC时间,格式为:yyyy-MM-ddTHH:mm:ssZ,EndTime和StartTime之间的间隔不能超过1天。
    describeLiveStreamSnapshotInfoRequest.setEndTime("<EndTime>");
    DescribeLiveStreamSnapshotInfoResponse describeLiveStreamSnapshotInfoResponse = null;
    try {
        describeLiveStreamSnapshotInfoResponse = client.getAcsResponse(describeLiveStreamSnapshotInfoRequest);
    } catch (ClientException e) {
        e.printStackTrace();
    }
    System.out.println(new Gson().toJson(describeLiveStreamSnapshotInfoResponse));
    重要
    • 目前只支持查询一年内其中某一天(EndTime和StartTime之间的间隔不能超过1天)的截图文件。

    • 截图类型配置为覆盖截图+实时截图的情况下,只能查询出实时截图的文件内容。若在此情况下要查看覆盖截图的截图文件,请在OSS中查看,详情可参见OSS列举文件

    • 接口暂不支持分页,且一次最多返回100条数据(默认返回10条数据)。

    • 更多查询截图文件内容接口说明,请参见DescribeLiveStreamSnapshotInfo

  2. 删除截图文件。

    说明

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

    //需要将<>内容替换成实际使用的值 
    DefaultProfile profile = DefaultProfile.getProfile("<regionId>", "<ALIBABA_CLOUD_ACCESS_KEY_ID>", "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>");
    IAcsClient client = new DefaultAcsClient(profile);        
    DeleteSnapshotFilesRequest deleteSnapshotFilesRequest=new DeleteSnapshotFilesRequest();
    deleteSnapshotFilesRequest.setAppName("<AppName>");
    deleteSnapshotFilesRequest.setStreamName("<StreamName>");
    deleteSnapshotFilesRequest.setDomainName("<DomainName>");
    //是否同步删除OSS中的文件
    deleteSnapshotFilesRequest.setRemoveFile(true);
    List<Long> createTimestampLists=new ArrayList<>();
    //添加需要删除的截图文件时间戳
    //createTimestampLists.add(<截图文件时间戳>);
    deleteSnapshotFilesRequest.setCreateTimestampLists(createTimestampLists);
    DeleteSnapshotFilesResponse deleteSnapshotFilesResponse= null;
    try {
        deleteSnapshotFilesResponse = client.getAcsResponse(deleteSnapshotFilesRequest);
    } catch (ClientException e) {
        e.printStackTrace();
    }
    System.out.println(new Gson().toJson(deleteSnapshotFilesResponse));
    重要
    • 目前只支持删除一年内的截图文件。

    • 对于覆盖截图的截图文件,目前只能在OSS中进行删除,具体操作可参见OSS删除文件

    • 更多删除直播截图文件接口说明,请参见DeleteSnapshotFiles

以上示例实现了对截图文件的删除(同时删除了储存在OSS中的文件)。

在您实际的业务系统中,查询截图内容接口不一定能满足您的业务需求,所以建议您为截图功能设置回调事件,获取回调参数将截图信息保存至您自己的业务系统(同时储存时间戳),在需要删除文件时,您就可以根据您系统的策略(如通过定时任务每天定时删除N个月以前的截图文件)查询出截图文件时间戳对截图文件进行删除。若想了解截图回调,可参见直播截图回调开发指南。

相关文档

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

更多直播截图API,可参见直播截图相关API