直播水印

直播水印功能可以给直播视频添加水印,通过本文档您可以了解如何实现直播水印功能。

应用场景

版权保护:水印是保护版权的一种常用措施,视频直播服务提供了直播水印功能,可以对直播视频添加水印。

广告:在直播过程中,可以通过直播水印功能在视频中打上广告标签,比如优惠活动等信息。

前期准备

  • 使用水印功能,需要准备水印图片。目前视频直播只支持图片水印,如果您有文字水印需求,可以将文字制作成PNG图片形式(水印图片支持JPG、PNG格式)。

  • 水印图片URL地址。目前视频直播只支持URL地址形式访问水印图片,暂不支持直接上传图片,使用直播水印功能时,请确保视频直播服务能够长期有效地访问您的水印图片。

功能配置

使用直播水印功能需要进行功能配置,配置内容分为水印模板水印规则两部分。

水印模板:配置水印相关信息,包括水印在直播视频中的位置,透明度,水印图片地址等。

水印规则:配置水印应用规则,包含AppName,StreamName,关联水印模板。

配置水印模板

目前可以通过视频直播控制台以及API配置水印模板。

通过视频直播控制台配置水印模板请参见控制台操作水印模板

使用API配置水印模板时,建议您结合控制台进行配置(水印模板参数设置较为复杂,控制台配置水印模板可以使用可视化界面拖动以及预览水印位置)。

实现过程>>>

  1. 首先,您通过视频直播控制台添加一个水印模板。

  2. 完成各项参数配置后,查询水印模板信息。Java SDK示例代码如下:

            //需要<>内容替换成实际使用的值
            DefaultProfile profile = DefaultProfile.getProfile("<regionId>", "<ALIBABA_CLOUD_ACCESS_KEY_ID>", "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>");
            IAcsClient client = new DefaultAcsClient(profile);
            DescribeLiveStreamWatermarksRequest describeLiveStreamWatermarksRequest=new DescribeLiveStreamWatermarksRequest();
            describeLiveStreamWatermarksRequest.setDomain("<DomainName>");
            try {
                DescribeLiveStreamWatermarksResponse response = client.getAcsResponse(describeLiveStreamWatermarksRequest);
                System.out.println(new Gson().toJson(response));
            } catch (ServerException e) {
                e.printStackTrace();
            } catch (ClientException e) {
                System.out.println("ErrCode:" + e.getErrCode());
                System.out.println("ErrMsg:" + e.getErrMsg());
                System.out.println("RequestId:" + e.getRequestId());
            }
    说明

  3. 添加水印模板配置。Java SDK示例代码如下:

            //需要<>内容替换成实际使用的值
            DefaultProfile profile = DefaultProfile.getProfile("<regionId>", "<ALIBABA_CLOUD_ACCESS_KEY_ID>", "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>");
            IAcsClient client = new DefaultAcsClient(profile);
            AddLiveStreamWatermarkRequest addLiveStreamWatermarkRequest = new AddLiveStreamWatermarkRequest();
            addLiveStreamWatermarkRequest.setType(0);
            addLiveStreamWatermarkRequest.setName("<WatermarkName>");
            addLiveStreamWatermarkRequest.setDescription("<Description>");
            addLiveStreamWatermarkRequest.setRefWidth(<1920>);
            addLiveStreamWatermarkRequest.setRefHeight(<1080>);
            addLiveStreamWatermarkRequest.setOffsetCorner("<TopRight>");
            addLiveStreamWatermarkRequest.setXOffset(<50.0>);
            addLiveStreamWatermarkRequest.setYOffset(<100.0>);
            addLiveStreamWatermarkRequest.setHeight(<200>);
            addLiveStreamWatermarkRequest.setTransparency(<255>);
            addLiveStreamWatermarkRequest.setPictureUrl("<PictureUrl>");
            addLiveStreamWatermarkRequest.setDomain("<DomainName>");
    
            try {
                AddLiveStreamWatermarkResponse addLiveStreamWatermarkResponse = client.getAcsResponse(addLiveStreamWatermarkRequest);
                System.out.println(new Gson().toJson(addLiveStreamWatermarkResponse));
            } catch (ServerException e) {
                e.printStackTrace();
            } catch (ClientException e) {
                System.out.println("ErrCode:" + e.getErrCode());
                System.out.println("ErrMsg:" + e.getErrMsg());
                System.out.println("RequestId:" + e.getRequestId());
            }
    

    到此即完成水印模板配置,配置水印模板之后需要配置水印应用规则。

配置水印规则

在配置水印模板之后,需要进行水印规则配置。水印规则可以关联水印模板。

水印规则同样可以通过视频直播控制台以及API方式进行配置。

通过视频直播控制台配置水印规则请参见控制台操作水印规则

通过API配置水印规则可参考以下示例。

Java SDK添加水印规则示例代码>>>

        //需要<>内容替换成实际使用的值
        DefaultProfile profile = DefaultProfile.getProfile("<regionId>", "<ALIBABA_CLOUD_ACCESS_KEY_ID>", "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>");
        IAcsClient client = new DefaultAcsClient(profile);
        AddLiveStreamWatermarkRuleRequest addLiveStreamWatermarkRuleRequest = new AddLiveStreamWatermarkRuleRequest();
        addLiveStreamWatermarkRuleRequest.setName("<WatermarkRuleName>");
        addLiveStreamWatermarkRuleRequest.setDomain("<DomainName>");
        addLiveStreamWatermarkRuleRequest.setApp("<AppName>");
        addLiveStreamWatermarkRuleRequest.setStream("<StreamName>");
        addLiveStreamWatermarkRuleRequest.setTemplateId("<TemplateId>");

        try {
            AddLiveStreamWatermarkRuleResponse addLiveStreamWatermarkRuleResponse = client.getAcsResponse(addLiveStreamWatermarkRuleRequest);
            System.out.println(new Gson().toJson(addLiveStreamWatermarkRuleResponse));
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }
说明
  • <AppName>不超过256字符,支持数字、大小写字母、短划线(-)、下划线(_),暂不支持星号(*)。

  • 水印规则配置匹配时存在优先级,优先匹配<StreamName>不为星号(*)的配置。

  • 更多参数说明可参见AddLiveStreamWatermarkRule - 添加水印规则API。

功能使用

水印模板以及水印规则配置完成之后,推流播放即可使用直播水印功能,配置了水印功能的直播视频样例如下图所示:

image

在该示例中,将文字制作成PNG格式图片实现了水印功能。

水印透明度设置

设置水印透明度示例代码:

//水印透明度,数值越小越透明。取值:0~255。默认255
addLiveStreamWatermarkRequest.setTransparency(255);

比如现在将透明度设置为128,直播视频样例效果如下图所示:

image

更新水印

更新水印模板示例代码>>>

        //需要<>内容替换成实际使用的值
        DefaultProfile profile = DefaultProfile.getProfile("<regionId>", "<ALIBABA_CLOUD_ACCESS_KEY_ID>", "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>");
        IAcsClient client = new DefaultAcsClient(profile);
        UpdateLiveStreamWatermarkRequest updateLiveStreamWatermarkRequest = new UpdateLiveStreamWatermarkRequest();
        updateLiveStreamWatermarkRequest.setTemplateId("<TemplateId>");
        updateLiveStreamWatermarkRequest.setName("<WatermarkName>");
        updateLiveStreamWatermarkRequest.setDescription("<Description>");
        updateLiveStreamWatermarkRequest.setRefWidth(<1920>);
        updateLiveStreamWatermarkRequest.setRefHeight(<1080>);
        updateLiveStreamWatermarkRequest.setOffsetCorner("<TopRight>");
        updateLiveStreamWatermarkRequest.setXOffset(<50.0>);
        updateLiveStreamWatermarkRequest.setYOffset(<100.0>);
        updateLiveStreamWatermarkRequest.setHeight(<200>);
        updateLiveStreamWatermarkRequest.setTransparency(<255>);
        updateLiveStreamWatermarkRequest.setPictureUrl("<PictureUrl>");
        //其他参数设置
        try {
            UpdateLiveStreamWatermarkResponse response = client.getAcsResponse(updateLiveStreamWatermarkRequest);
            System.out.println(new Gson().toJson(response));
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }

说明

更新水印规则示例代码>>>

        //需要<>内容替换成实际使用的值
        DefaultProfile profile = DefaultProfile.getProfile("<regionId>", "<ALIBABA_CLOUD_ACCESS_KEY_ID>", "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>");
        IAcsClient client = new DefaultAcsClient(profile);
        UpdateLiveStreamWatermarkRuleRequest updateLiveStreamWatermarkRuleRequest = new UpdateLiveStreamWatermarkRuleRequest();
        updateLiveStreamWatermarkRuleRequest.setRuleId("<RuleId>");
        updateLiveStreamWatermarkRuleRequest.setTemplateId("<TemplateId>");
        try {
            UpdateLiveStreamWatermarkRuleResponse updateLiveStreamWatermarkRuleResponse = client.getAcsResponse(updateLiveStreamWatermarkRuleRequest);
            System.out.println(new Gson().toJson(updateLiveStreamWatermarkRuleResponse));
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }

说明

更新水印模板或水印规则之后需要重新推流才能生效,但有时候您可能需要在直播过程中更新水印,此时可以通过动态更新水印功能实现。

您可以调用DynamicUpdateWaterMarkStreamRule - 动态更新水印API实现动态调整水印功能。

动态更新水印示例代码>>>

      //需要<>内容替换成实际使用的值
        DefaultProfile profile = DefaultProfile.getProfile("<regionId>", "<ALIBABA_CLOUD_ACCESS_KEY_ID>", "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>");
        IAcsClient client = new DefaultAcsClient(profile);
        DynamicUpdateWaterMarkStreamRuleRequest dynamicUpdateWaterMarkStreamRuleRequest = new DynamicUpdateWaterMarkStreamRuleRequest();
        dynamicUpdateWaterMarkStreamRuleRequest.setDomain("<DomainName>");
        dynamicUpdateWaterMarkStreamRuleRequest.setApp("<AppName>");
        dynamicUpdateWaterMarkStreamRuleRequest.setStream("<Stream>");
        dynamicUpdateWaterMarkStreamRuleRequest.setTemplateId("<TemplateId>");

        try {
            DynamicUpdateWaterMarkStreamRuleResponse dynamicUpdateWaterMarkStreamRuleResponse = client.getAcsResponse(dynamicUpdateWaterMarkStreamRuleRequest);
            System.out.println(new Gson().toJson(dynamicUpdateWaterMarkStreamRuleResponse));
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }

重要
  • <TemplateId>可以是新建的模板ID,也可以是原模板ID。调用此方法后,将按照模板最新的配置(包括图片,透明度,位置等信息)更新水印。

  • 目前无法动态更新StreamName配置为模糊匹配的水印规则

删除水印模板

若是需要删除水印模板,需要先删除水印规则。

删除水印规则示例代码>>>

       //需要<>内容替换成实际使用的值
        DefaultProfile profile = DefaultProfile.getProfile("<regionId>", "<ALIBABA_CLOUD_ACCESS_KEY_ID>", "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>");
        IAcsClient client = new DefaultAcsClient(profile);
        DeleteLiveStreamWatermarkRuleRequest deleteLiveStreamWatermarkRuleRequest = new DeleteLiveStreamWatermarkRuleRequest();
        deleteLiveStreamWatermarkRuleRequest.setDomain("<DomainName>");
        deleteLiveStreamWatermarkRuleRequest.setRuleId("<RuleId>");

        try {
            DeleteLiveStreamWatermarkRuleResponse deleteLiveStreamWatermarkRuleResponse = client.getAcsResponse(deleteLiveStreamWatermarkRuleRequest);
            System.out.println(new Gson().toJson(deleteLiveStreamWatermarkRuleResponse));
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }
说明

水印规则支持通过AppName进行删除,相关说明可参见DeleteLiveStreamWatermarkRule - 删除水印规则

删除水印模板示例代码>>>

       //需要<>内容替换成实际使用的值
        DefaultProfile profile = DefaultProfile.getProfile("<regionId>", "<ALIBABA_CLOUD_ACCESS_KEY_ID>", "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>");
        IAcsClient client = new DefaultAcsClient(profile);
        DeleteLiveStreamWatermarkRequest deleteLiveStreamWatermarkRequest = new DeleteLiveStreamWatermarkRequest();
        deleteLiveStreamWatermarkRequest.setTemplateId("<TemplateId>");

        try {
            DeleteLiveStreamWatermarkResponse deleteLiveStreamWatermarkResponse = client.getAcsResponse(deleteLiveStreamWatermarkRequest);
            System.out.println(new Gson().toJson(deleteLiveStreamWatermarkResponse));
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }

说明

相关文档

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