前言 最近公司有个项目,需要在线播放视频且需要添加水印,思来想去还是前端实现简单点,特此记录下实现过程,借鉴了下网上的方法,也添加了点自己的东西。
思路 需要给播放视频添加水印信息,可以在播放的时候获取到每一帧,然后绘制到 canvas 画布上,以画布的方式来播放视频(某些情况下可能会有卡顿的情况,如果要求不是很高已经可以满足需要)。
效果
代码 html 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <body > <video id ="video" src ="http://localhost:8080/projectdemo/video/getFile.do" style ="display: none;" > </video > <canvas id ="canvas" class ="canvas" height ="500" width ="600" > </canvas > <footer > <button id ="videoPlay" > 播放/暂停</button > <button id ="videoVolumeUp" > 音量增大</button > <button id ="videoVolumeDown" > 音量减小</button > <button id ="fullScreen" > 全屏</button > </footer > </body >
js 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 var vol = 0.1 ; var time = 10 ; var video = document .getElementById ("video" );var canvas = document .getElementById ("canvas" );var interval = null ; var timeFunName = null ; var interstitial = false ; function videoToCanvas ( ) { canvas.getContext ("2d" ).drawImage (video, 0 , 0 , canvas.width , canvas.height ); createText (canvas.getContext ("2d" ), "欢迎使用!" , canvas); } video.addEventListener ("loadeddata" , function ( ) { videoToCanvas (); }); document .getElementById ("videoPlay" ).addEventListener ("click" , function ( ) { video.paused === true ? (video.play (), syncDrawing ()) : video.pause (); }); document .getElementById ("videoVolumeUp" ).addEventListener ("click" , function ( ) { video.volume > 1 || video.volume == 1 ? (video.volume = 1 ) : (video.volume = video.volume + vol); }); document .getElementById ("videoVolumeDown" ) .addEventListener ("click" , function ( ) { video.volume < 0.2 || video.volume == 0 ? (video.volume = 0 ) : (video.volume = video.volume - vol); }); document .getElementById ("fullScreen" ).addEventListener ("click" , function ( ) { fullScreen (); }); canvas.addEventListener ("click" , function ( ) { clearTimeout (timeFunName); timeFunName = setTimeout (function ( ) { video.paused === true ? video.play () : video.pause (); }, 300 ); }); canvas.addEventListener ("dblclick" , function ( ) { clearTimeout (timeFunName); if (interstitial) { exitFullScreen (); } else { fullScreen (); } }); function syncDrawing ( ) { clearInterval (interval); interval = window .setInterval (function ( ) { videoToCanvas (); }, 1 ); } document .onkeyup = function (event ) { var e = event || window .event || arguments .callee .caller .arguments [0 ]; if (e && e.keyCode === 38 ) { video.volume !== 1 ? (video.volume += vol) : 1 ; return false ; } else if (e && e.keyCode === 40 ) { video.volume !== 0 ? (video.volume -= vol) : 1 ; return false ; } else if (e && e.keyCode === 37 ) { video.currentTime !== 0 ? (video.currentTime -= time) : 1 ; return false ; } else if (e && e.keyCode === 39 ) { video.volume !== video.duration ? (video.currentTime += time) : 1 ; return false ; } else if (e && e.keyCode === 32 ) { video.paused === true ? video.play () : video.pause (); return false ; } }; function createText (ctx, text, canvas ) { ctx.fillStyle = "white" ; ctx.font = "60px '微软雅黑'" ; ctx.textAlign = "left" ; ctx.shadowBlur = 10 ; ctx.shadowOffsetX = 5 ; ctx.shadowOffsetY = 5 ; ctx.shadowColor = "black" ; ctx.fillText (text, canvas.width / 2 - 150 , canvas.height / 2 ); } function fullScreen ( ) { var element = document .getElementById ("canvas" ), method = "RequestFullScreen" ; var prefixMethod = null ; ["webkit" , "moz" , "ms" , "o" , "" ].forEach (function (prefix ) { if (prefixMethod) return ; if (prefix === "" ) { method = method.slice (0 , 1 ).toLowerCase () + method.slice (1 ); } var fsMethod = typeof element[prefix + method]; if (fsMethod + "" !== "undefined" ) { if (fsMethod === "function" ) { prefixMethod = element[prefix + method](); } else { prefixMethod = element[prefix + method]; } } }); interstitial = true ; return prefixMethod; } function exitFullScreen ( ) { try { de = document ; if (de.exitFullscreen ) { de.exitFullscreen (); } else if (de.webkitExitFullScreen ) { de.webkitExitFullScreen (); } else if (de.webkitCancelFullScreen ) { de.webkitCancelFullScreen (); } else if (de.mozCancelFullScreen ) { de.mozCancelFullScreen (); } else if (de.msExitFullScreen ) { de.msExitFullScreen (); } } catch (err) { alert (err.description ); } interstitial = false ; }