直播水印功能可以给直播视频添加水印,通过本文档您可以了解如何实现直播水印功能。
应用场景
版权保护:水印是保护版权的一种常用措施,视频直播服务提供了直播水印功能,可以对直播视频添加水印。
广告:在直播过程中,可以通过直播水印功能在视频中打上广告标签,比如优惠活动等信息。
前期准备
使用水印功能,需要准备水印图片。目前视频直播只支持图片水印,如果您有文字水印需求,可以将文字制作成PNG图片形式(水印图片支持JPG、PNG格式)。
水印图片URL地址。目前视频直播只支持URL地址形式访问水印图片,暂不支持直接上传图片,使用直播水印功能时,请确保视频直播服务能够长期有效地访问您的水印图片。
功能配置
使用直播水印功能需要进行功能配置,配置内容分为水印模板和水印规则两部分。
水印模板:配置水印相关信息,包括水印在直播视频中的位置,透明度,水印图片地址等。
水印规则:配置水印应用规则,包含AppName,StreamName,关联水印模板。
配置水印模板
目前可以通过视频直播控制台以及API配置水印模板。
控制台配置水印模板
登录视频直播控制台。
在左侧导航栏选择功能管理>直播水印,进入直播水印页面,选择水印模板页签。
选择待配置的播流域名。
单击添加水印模板,配置水印模板。
您可以在预览区域查看水印效果,通过调整预览画面尺寸、水印尺寸和位置等信息对实际效果进行实时预览。水印模板参数及说明如下表所示。
参数
描述
水印模板名称
水印模板的名称。支持输入中英文、数字、短划线(-)、下划线(_)符号,长度不超过30个字符。
水印描述
水印信息描述。支持输入中英文、数字、字符,长度不超过128个字符。
水印素材
输入HTTP或HTTPS链接的水印图片地址。
建议水印图片地址是OSS的HTTP永久有效地址或者长期鉴权的有效地址。
坐标原点
水印在输出视频画面的大概位置,用于标示水印初始位置,水印将根据此坐标原点进行偏移。取值:
右上(默认值)
右下
左上
左下
预览画面尺寸(宽x高)
可以根据实际视频信息输入,预览对应的展示位置和效果。单位:像素。
水印尺寸(宽x高)
水印图片的大小,宽度将根据高度自适应。
取值范围:[0,4096]。
单位:像素。
水印水平偏移
水印在输出视频画面上水平偏移距离。
取值范围:[0,4096]。
单位:像素。
水印垂直偏移
水印在输出视频画面上垂直偏移距离。
取值范围:[0,4096]。
单位:像素。
透明度
水印图片的透明度,值越小越透明,100%代表不透明。
取值范围:[0,100]。
单位:百分比。
单击保存,完成水印模板配置。
添加水印模板成功后,会弹出添加水印规则提示框。您可以单击立即添加,为此模板添加水印规则;如果您暂不需要添加水印规则,可以选择稍后再说,后续添加。水印规则配置,请参见配置水印规则。
说明水印模板配置完成后,需要再添加水印规则,并在水印规则中关联水印模板,设置AppName、StreamName,且必须与直播推流地址的AppName、StreamName保持一致,重新推流后,播流中才能带水印。
API配置水印模板
使用API配置水印模板时,建议您结合控制台进行配置(水印模板参数设置较为复杂,控制台配置水印模板可以使用可视化界面拖动以及预览水印位置)。
首先,您通过视频直播控制台添加一个水印模板。
完成各项参数配置后,查询水印模板信息。
//需要<>内容替换成实际使用的值 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()); }
说明查询水印模板列表支持根据模板ID或名称查询,详情请参见DescribeLiveStreamWatermarks - 查询水印模板列表API说明。
您可以将查询出的水印模板信息在您的业务系统内保存成模板。
添加水印模板配置。
//需要<>内容替换成实际使用的值 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()); }
说明各参数说明AddLiveStreamWatermark - 添加⽔印模板API。
到此即完成水印模板配置,配置水印模板之后需要配置水印应用规则。
直播水印暂不支持与直播时移同时配置使用。
配置水印规则
在配置水印模板之后,需要进行水印规则配置。水印规则可以关联水印模板。
水印规则同样可以通过视频直播控制台以及API方式进行配置。
控制台配置水印规则
登录视频直播控制台。
在左侧导航栏选择功能管理>直播水印,进入直播水印页面,选择水印规则页签。
选择待配置的播流域名。
单击添加水印规则。
水印规则参数及说明如下表所示:
参数
描述
规则名称
水印规则名称。支持输入中英文、数字、字符,长度不超过32个字符。
规则描述
水印规则描述。支持输入中英文、数字、字符,长度不超过128个字符。
AppName
播流所属应用名称。AppName必须与推流地址中的AppName名称一样,水印模板才能生效。支持数字、大小写字母、短划线(-)、下划线(_),长度不超过256个字符。
StreamName
直播流名称。规则如下:
直接写流名称则仅匹配该流名称。示例:
liveStreamA
。可进行模糊匹配。
如果需要匹配全部直播流,仅输入星号(*)即可。
也可以进行前匹配或后匹配。格式要求:匹配项需要用
()
符号包围,多个匹配项用竖线|
分隔;模糊匹配的星号(*)只能放在最前面或最后面。示例:(abc|123)*
表示匹配所有前缀为abc或者123的流;*(t1|t2)
表示匹配所有后缀为t1或t2的流。支持数字、大小写字母、短划线(-)、下划线(_)、星号(*)、等号(=),长度不超过256个字符。
水印模板
选择已配置好的水印模板。若无模板,请先添加水印模板,具体操作请参见配置水印模板。
单击保存,完成水印规则的配置。
说明水印规则配置成功后,需要重新推流后,播流中才能带水印。
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。
功能使用
水印模板以及水印规则配置完成之后,推流播放即可使用直播水印功能,配置了水印功能的直播视频样例如下图所示:
在该示例中,将文字制作成PNG格式图片实现了水印功能。
水印透明度设置
设置水印透明度示例代码:
//水印透明度,数值越小越透明。取值:0~255。默认255
addLiveStreamWatermarkRequest.setTransparency(255);
比如现在将透明度设置为128,直播视频样例效果如下图所示:
更新水印
更新水印模板示例代码>>>
//需要<>内容替换成实际使用的值
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());
}
<regionId>需要与模板对应域名直播中心同区域,获取区域ID请参见服务接入点。
更多参数说明可参见UpdateLiveStreamWatermark - 更新水印模板API。
更新水印规则示例代码>>>
//需要<>内容替换成实际使用的值
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());
}
<regionId>需要与模板对应域名直播中心同区域,获取区域ID请参见服务接入点。
更新水印规则时可以更新规则其他信息,详情可参见APIUpdateLiveStreamWatermarkRule - 更新水印规则。
更新水印模板或水印规则之后需要重新推流才能生效,但有时候您可能需要在直播过程中更新水印,此时可以通过动态更新水印功能实现。
您可以调用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());
}
<regionId>需要与模板对应域名直播中心同区域,获取区域ID请参见服务接入点。
更多信息可参见DeleteLiveStreamWatermark - 删除⽔印模板API。
相关文档
使用Java SDK,请参见Java SDK使用说明。