直播水印
直播水印功能可以給直播視頻添加水印,通過(guò)本文檔您可以了解如何實(shí)現(xiàn)直播水印功能。
應(yīng)用場(chǎng)景
版權(quán)保護(hù):水印是保護(hù)版權(quán)的一種常用措施,視頻直播服務(wù)提供了直播水印功能,可以對(duì)直播視頻添加水印。
廣告:在直播過(guò)程中,可以通過(guò)直播水印功能在視頻中打上廣告標(biāo)簽,比如優(yōu)惠活動(dòng)等信息。
前期準(zhǔn)備
使用水印功能,需要準(zhǔn)備水印圖片。目前視頻直播只支持圖片水印,如果您有文字水印需求,可以將文字制作成PNG圖片形式(水印圖片支持JPG、PNG格式)。
水印圖片URL地址。目前視頻直播只支持URL地址形式訪(fǎng)問(wèn)水印圖片,暫不支持直接上傳圖片,使用直播水印功能時(shí),請(qǐng)確保視頻直播服務(wù)能夠長(zhǎng)期有效地訪(fǎng)問(wèn)您的水印圖片。
功能配置
使用直播水印功能需要進(jìn)行功能配置,配置內(nèi)容分為水印模板和水印規(guī)則兩部分。
水印模板:配置水印相關(guān)信息,包括水印在直播視頻中的位置,透明度,水印圖片地址等。
水印規(guī)則:配置水印應(yīng)用規(guī)則,包含AppName,StreamName,關(guān)聯(lián)水印模板。
配置水印模板
目前可以通過(guò)視頻直播控制臺(tái)以及API配置水印模板。
登錄視頻直播控制臺(tái)。
在左側(cè)導(dǎo)航欄選擇功能管理>直播水印,進(jìn)入直播水印頁(yè)面,選擇水印模板頁(yè)簽。
選擇待配置的播流域名。
單擊添加水印模板,配置水印模板。
您可以在預(yù)覽區(qū)域查看水印效果,通過(guò)調(diào)整預(yù)覽畫(huà)面尺寸、水印尺寸和位置等信息對(duì)實(shí)際效果進(jìn)行實(shí)時(shí)預(yù)覽。水印模板參數(shù)及說(shuō)明如下表所示。
參數(shù)
描述
水印模板名稱(chēng)
水印模板的名稱(chēng)。支持輸入中英文、數(shù)字、短劃線(xiàn)(-)、下劃線(xiàn)(_)符號(hào),長(zhǎng)度不超過(guò)30個(gè)字符。
水印描述
水印信息描述。支持輸入中英文、數(shù)字、字符,長(zhǎng)度不超過(guò)128個(gè)字符。
水印素材
輸入HTTP或HTTPS鏈接的水印圖片地址。
建議水印圖片地址是OSS的HTTP永久有效地址或者長(zhǎng)期鑒權(quán)的有效地址。
坐標(biāo)原點(diǎn)
水印在輸出視頻畫(huà)面的大概位置,用于標(biāo)示水印初始位置,水印將根據(jù)此坐標(biāo)原點(diǎn)進(jìn)行偏移。取值:
右上(默認(rèn)值)
右下
左上
左下
預(yù)覽畫(huà)面尺寸(寬x高)
可以根據(jù)實(shí)際視頻信息輸入,預(yù)覽對(duì)應(yīng)的展示位置和效果。單位:像素。
水印尺寸(寬x高)
水印圖片的大小,寬度將根據(jù)高度自適應(yīng)。
取值范圍:[0,4096]。
單位:像素。
水印水平偏移
水印在輸出視頻畫(huà)面上水平偏移距離。
取值范圍:[0,4096]。
單位:像素。
水印垂直偏移
水印在輸出視頻畫(huà)面上垂直偏移距離。
取值范圍:[0,4096]。
單位:像素。
透明度
水印圖片的透明度,值越小越透明,100%代表不透明。
取值范圍:[0,100]。
單位:百分比。
單擊保存,完成水印模板配置。
添加水印模板成功后,會(huì)彈出添加水印規(guī)則提示框。您可以單擊立即添加,為此模板添加水印規(guī)則;如果您暫不需要添加水印規(guī)則,可以選擇稍后再說(shuō),后續(xù)添加。水印規(guī)則配置,請(qǐng)參見(jiàn)配置水印規(guī)則。
說(shuō)明水印模板配置完成后,需要再添加水印規(guī)則,并在水印規(guī)則中關(guān)聯(lián)水印模板,設(shè)置AppName、StreamName,且必須與直播推流地址的AppName、StreamName保持一致,重新推流后,播流中才能帶水印。
使用API配置水印模板時(shí),建議您結(jié)合控制臺(tái)進(jìn)行配置(水印模板參數(shù)設(shè)置較為復(fù)雜,控制臺(tái)配置水印模板可以使用可視化界面拖動(dòng)以及預(yù)覽水印位置)。
首先,您通過(guò)視頻直播控制臺(tái)添加一個(gè)水印模板。
完成各項(xiàng)參數(shù)配置后,查詢(xún)水印模板信息。
//需要<>內(nèi)容替換成實(shí)際使用的值 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()); }
說(shuō)明查詢(xún)水印模板列表支持根據(jù)模板ID或名稱(chēng)查詢(xún),詳情請(qǐng)參見(jiàn)DescribeLiveStreamWatermarks - 查詢(xún)水印模板列表API說(shuō)明。
您可以將查詢(xún)出的水印模板信息在您的業(yè)務(wù)系統(tǒng)內(nèi)保存成模板。
添加水印模板配置。
//需要<>內(nèi)容替換成實(shí)際使用的值 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()); }
說(shuō)明各參數(shù)說(shuō)明AddLiveStreamWatermark - 添加?印模板API。
到此即完成水印模板配置,配置水印模板之后需要配置水印應(yīng)用規(guī)則。
直播水印暫不支持與直播時(shí)移同時(shí)配置使用。
配置水印規(guī)則
在配置水印模板之后,需要進(jìn)行水印規(guī)則配置。水印規(guī)則可以關(guān)聯(lián)水印模板。
水印規(guī)則同樣可以通過(guò)視頻直播控制臺(tái)以及API方式進(jìn)行配置。
登錄視頻直播控制臺(tái)。
在左側(cè)導(dǎo)航欄選擇功能管理>直播水印,進(jìn)入直播水印頁(yè)面,選擇水印規(guī)則頁(yè)簽。
選擇待配置的播流域名。
單擊添加水印規(guī)則。
水印規(guī)則參數(shù)及說(shuō)明如下表所示:
參數(shù)
描述
規(guī)則名稱(chēng)
水印規(guī)則名稱(chēng)。支持輸入中英文、數(shù)字、字符,長(zhǎng)度不超過(guò)32個(gè)字符。
規(guī)則描述
水印規(guī)則描述。支持輸入中英文、數(shù)字、字符,長(zhǎng)度不超過(guò)128個(gè)字符。
AppName
播流所屬應(yīng)用名稱(chēng)。AppName必須與推流地址中的AppName名稱(chēng)一樣,水印模板才能生效。支持?jǐn)?shù)字、大小寫(xiě)字母、短劃線(xiàn)(-)、下劃線(xiàn)(_),長(zhǎng)度不超過(guò)256個(gè)字符。
StreamName
直播流名稱(chēng)。規(guī)則如下:
直接寫(xiě)流名稱(chēng)則僅匹配該流名稱(chēng)。示例:
liveStreamA
。可進(jìn)行模糊匹配。
如果需要匹配全部直播流,僅輸入星號(hào)(*)即可。
也可以進(jìn)行前匹配或后匹配。格式要求:匹配項(xiàng)需要用
()
符號(hào)包圍,多個(gè)匹配項(xiàng)用豎線(xiàn)|
分隔;模糊匹配的星號(hào)(*)只能放在最前面或最后面。示例:(abc|123)*
表示匹配所有前綴為abc或者123的流;*(t1|t2)
表示匹配所有后綴為t1或t2的流。支持?jǐn)?shù)字、大小寫(xiě)字母、短劃線(xiàn)(-)、下劃線(xiàn)(_)、星號(hào)(*)、等號(hào)(=),長(zhǎng)度不超過(guò)256個(gè)字符。
水印模板
選擇已配置好的水印模板。若無(wú)模板,請(qǐng)先添加水印模板,具體操作請(qǐng)參見(jiàn)配置水印模板。
單擊保存,完成水印規(guī)則的配置。
說(shuō)明水印規(guī)則配置成功后,需要重新推流后,播流中才能帶水印。
//需要<>內(nèi)容替換成實(shí)際使用的值
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>不超過(guò)256字符,支持?jǐn)?shù)字、大小寫(xiě)字母、短劃線(xiàn)(-)、下劃線(xiàn)(_),暫不支持星號(hào)(*)。
水印規(guī)則配置匹配時(shí)存在優(yōu)先級(jí),優(yōu)先匹配<StreamName>不為星號(hào)(*)的配置。
更多參數(shù)說(shuō)明可參見(jiàn)AddLiveStreamWatermarkRule - 添加水印規(guī)則API。
功能使用
水印模板以及水印規(guī)則配置完成之后,推流播放即可使用直播水印功能,配置了水印功能的直播視頻樣例如下圖所示:
在該示例中,將文字制作成PNG格式圖片實(shí)現(xiàn)了水印功能。
水印透明度設(shè)置
設(shè)置水印透明度示例代碼:
//水印透明度,數(shù)值越小越透明。取值:0~255。默認(rèn)255
addLiveStreamWatermarkRequest.setTransparency(255);
比如現(xiàn)在將透明度設(shè)置為128,直播視頻樣例效果如下圖所示:
更新水印
//需要<>內(nèi)容替換成實(shí)際使用的值
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>");
//其他參數(shù)設(shè)置
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>需要與模板對(duì)應(yīng)域名直播中心同區(qū)域,獲取區(qū)域ID請(qǐng)參見(jiàn)服務(wù)接入點(diǎn)。
更多參數(shù)說(shuō)明可參見(jiàn)UpdateLiveStreamWatermark - 更新水印模板API。
//需要<>內(nèi)容替換成實(shí)際使用的值
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>需要與模板對(duì)應(yīng)域名直播中心同區(qū)域,獲取區(qū)域ID請(qǐng)參見(jiàn)服務(wù)接入點(diǎn)。
更新水印規(guī)則時(shí)可以更新規(guī)則其他信息,詳情可參見(jiàn)APIUpdateLiveStreamWatermarkRule - 更新水印規(guī)則。
更新水印模板或水印規(guī)則之后需要重新推流才能生效,但有時(shí)候您可能需要在直播過(guò)程中更新水印,此時(shí)可以通過(guò)動(dòng)態(tài)更新水印功能實(shí)現(xiàn)。
您可以調(diào)用DynamicUpdateWaterMarkStreamRule - 動(dòng)態(tài)更新水印API實(shí)現(xiàn)動(dòng)態(tài)調(diào)整水印功能。
//需要<>內(nèi)容替換成實(shí)際使用的值
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。調(diào)用此方法后,將按照模板最新的配置(包括圖片,透明度,位置等信息)更新水印。
目前無(wú)法動(dòng)態(tài)更新StreamName配置為模糊匹配的水印規(guī)則。
刪除水印模板
若是需要?jiǎng)h除水印模板,需要先刪除水印規(guī)則。
//需要<>內(nèi)容替換成實(shí)際使用的值
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());
}
水印規(guī)則支持通過(guò)AppName進(jìn)行刪除,相關(guān)說(shuō)明可參見(jiàn)DeleteLiveStreamWatermarkRule - 刪除水印規(guī)則。
//需要<>內(nèi)容替換成實(shí)際使用的值
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>需要與模板對(duì)應(yīng)域名直播中心同區(qū)域,獲取區(qū)域ID請(qǐng)參見(jiàn)服務(wù)接入點(diǎn)。
更多信息可參見(jiàn)DeleteLiveStreamWatermark - 刪除?印模板API。
相關(guān)文檔
使用Java SDK,請(qǐng)參見(jiàn)Java SDK使用說(shuō)明。