php做視頻直播網(wǎng)站信息流廣告投放工作內(nèi)容
1.需求背景
其實騰訊云點播的api也支持視頻水印,但是只有單個水印,大概效果是這樣子的,不滿足我們的需求,我們的需求是需要視頻中都是水印。
騰訊云點播水印
項目需求的水印(主要是防錄屏,最后的實現(xiàn)效果是這樣)
2.實現(xiàn)
創(chuàng)建 warterMark.js
warterMark.js里面的代碼
import Vue from 'vue'Vue.directive('watermark', {bind: function(el, binding){// 水印文字,父元素,畫布寬度,畫布高度,字體,文字顏色,畫布橫坐標(biāo)function addWaterMarker(str, parentNode, width, height, font, textColor, fillTextX = '10'){ // 檢查父元素是否包含子元素const elementContains = (parent, child) => parent !== child && parent.contains(child);const flag = elementContains(parentNode, document.querySelector('canvas'));// 防止重復(fù)創(chuàng)建if (!flag) {let can = document.createElement('canvas');parentNode.appendChild(can);can.width = width || 200;can.height = height || 140;can.style.display = 'none';let cans = can.getContext('2d');cans.rotate(-20 * Math.PI / 180);cans.font = font || "13px Microsoft Yahei";cans.fillStyle = textColor || "#DDDDDD";cans.textAlign = 'left';cans.textBaseline = 'Middle';cans.fillText(str, fillTextX, can.height);// 設(shè)置背景圖(整個項目中都添加水印建議使用此方法)// parentNode.style.backgroundImage = "url(" + can.toDataURL("image/png") + ")";// 創(chuàng)建div 定位覆蓋(某個元素,如圖片添加水印建議使用此方法)let div = document.createElement('div');div.id = str;div.style.pointerEvents = 'none';div.style.top = '0';div.style.left = '0';div.style.position = 'absolute';div.style.zIndex = '100000';div.style.width = '100%';div.style.height = '100%';div.style.background = 'url(' + can.toDataURL('image/png') + ')';parentNode.appendChild(div);}}if (binding.value.text) {addWaterMarker(binding.value.text, el, binding.value.width, binding.value.height, binding.value.font, binding.value.textColor, binding.value.fillTextX )}}
})
main.js 引入warterMark.js (或者在想要添加的某個頁面引入)
import '@/utils/warterMark.js'
4.頁面結(jié)構(gòu)(注意水印一定要跟video同級,不要直接加到video上面去,會沒有用)
5.加了水印后效果如下圖,但是會出現(xiàn)一個問題,就是視頻在點擊全屏?xí)r,水印會消失
全屏?xí)r水印消失:
6.處理全屏視頻時水印消失的問題:
這段代碼的意思主要是監(jiān)聽視頻全屏?xí)r,就去拿到視頻標(biāo)簽元素 和 水印標(biāo)簽元素,然后把 水印標(biāo)簽元素append到視頻標(biāo)簽元素里面去就可以顯示水印了。(因為我這里用的是騰訊云sdk,大家可以根據(jù)自己用的視頻插件來寫,基本邏輯就在這里了)
原因就是在視頻全屏播放時,會把其他的元素都隱藏掉(css默認(rèn))。所以很多做視頻開發(fā)的開發(fā)者,他們的全屏其實不是真正的全屏,而是套了一個殼,把外面的殼放大了。
// 用戶全屏添加水印this.player.on('fullscreenchange', () => {const video_div = document.getElementsByClassName('course_video')[0]video_div.appendChild(document.getElementsByClassName('my_course_video_box')[0])})
3.補(bǔ)充(水印指令的用法)
如果只想作用于一個盒子時出現(xiàn)了這個情況,那么你需要給水印盒子添加一個position: relative;屬性
盒子css添加position: relative;屬性
.fanwai{width: 800px;height: 150px;border: 1px solid rebeccapurple;margin-top: 20px;position: relative;}
效果:
4.缺點:
該水印指令生成的水印 可以通過刪除dom元素(如果你的水印是在一個單獨(dú)的dom的話,如果你是作用在body上就不會,因為你把body刪了里面的內(nèi)容也沒了)就把水印刪了(只能說防普通用戶,防君子)??梢哉蚁缕渌乃〔寮纯础?但是視頻全屏?xí)r添加水印的邏輯是不變的。
5.demo地址:
https://github.com/rui-rui-an/watermark
如果demo運(yùn)行起來視頻不可用,可能是云點播的license過期了,大家可以自己去申請一個填到項目里。
云點播地址:https://cloud.tencent.com/document/product/266/58772
填到這里就可以了
6.參考鏈接:
vue 指令實現(xiàn)水印效果(掘金):https://juejin.cn/post/6966985241286148126