直播水印

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

应用场景

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

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

前期准备

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

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

功能配置

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

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

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

配置水印模板

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

控制台配置水印模板

  1. 登录视频直播控制台

  2. 在左侧导航栏选择功能管理>直播水印,进入直播水印页面,选择水印模板页签。

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

  4. 单击添加水印模板,配置水印模板。

    image

    您可以在预览区域查看水印效果,通过调整预览画面尺寸、水印尺寸和位置等信息对实际效果进行实时预览。水印模板参数及说明如下表所示。

    参数

    描述

    水印模板名称

    水印模板的名称。支持输入中英文、数字、短划线(-)、下划线(_)符号,长度不超过30个字符。

    水印描述

    水印信息描述。支持输入中英文、数字、字符,长度不超过128个字符。

    水印素材

    输入HTTP或HTTPS链接的水印图片地址。

    建议水印图片地址是OSS的HTTP永久有效地址或者长期鉴权的有效地址。

    坐标原点

    水印在输出视频画面的大概位置,用于标示水印初始位置,水印将根据此坐标原点进行偏移。取值:

    • 右上(默认值)

    • 右下

    • 左上

    • 左下

    预览画面尺寸(宽x高)

    可以根据实际视频信息输入,预览对应的展示位置和效果。单位:像素。

    水印尺寸(宽x高)

    水印图片的大小,宽度将根据高度自适应。

    • 取值范围:[0,4096]。

    • 单位:像素。

    水印水平偏移

    水印在输出视频画面上水平偏移距离。

    • 取值范围:[0,4096]。

    • 单位:像素。

    水印垂直偏移

    水印在输出视频画面上垂直偏移距离。

    • 取值范围:[0,4096]。

    • 单位:像素。

    透明度

    水印图片的透明度,值越小越透明,100%代表不透明。

    • 取值范围:[0,100]。

    • 单位:百分比。

  5. 单击保存,完成水印模板配置。

  6. 添加水印模板成功后,会弹出添加水印规则提示框。您可以单击立即添加,为此模板添加水印规则;如果您暂不需要添加水印规则,可以选择稍后再说,后续添加。水印规则配置,请参见配置水印规则

    说明

    水印模板配置完成后,需要再添加水印规则,并在水印规则中关联水印模板,设置AppName、StreamName,且必须与直播推流地址的AppName、StreamName保持一致,重新推流后,播流中才能带水印。

API配置水印模板

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

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

  2. 完成各项参数配置后,查询水印模板信息。

            //需要<>内容替换成实际使用的值
            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. 添加水印模板配置。

            //需要<>内容替换成实际使用的值
            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方式进行配置。

控制台配置水印规则

  1. 登录视频直播控制台

  2. 在左侧导航栏选择功能管理>直播水印,进入直播水印页面,选择水印规则页签。

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

  4. 单击添加水印规则

    image

    水印规则参数及说明如下表所示:

    参数

    描述

    规则名称

    水印规则名称。支持输入中英文、数字、字符,长度不超过32个字符。

    规则描述

    水印规则描述。支持输入中英文、数字、字符,长度不超过128个字符。

    AppName

    播流所属应用名称。AppName必须与推流地址中的AppName名称一样,水印模板才能生效。支持数字、大小写字母、短划线(-)、下划线(_),长度不超过256个字符。

    StreamName

    直播流名称。规则如下:

    • 直接写流名称则仅匹配该流名称。示例:liveStreamA

    • 可进行模糊匹配。

      如果需要匹配全部直播流,仅输入星号(*)即可。

      也可以进行前匹配或后匹配。格式要求:匹配项需要用()符号包围,多个匹配项用竖线|分隔;模糊匹配的星号(*)只能放在最前面或最后面。示例:(abc|123)*表示匹配所有前缀为abc或者123的流;*(t1|t2)表示匹配所有后缀为t1或t2的流。

    • 支持数字、大小写字母、短划线(-)、下划线(_)、星号(*)、等号(=),长度不超过256个字符。

    水印模板

    选择已配置好的水印模板。若无模板,请先添加水印模板,具体操作请参见配置水印模板

  5. 单击保存,完成水印规则的配置。

    说明

    水印规则配置成功后,需要重新推流后,播流中才能带水印。

API配置水印规则

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