在网页中插入视频我们常常会希望它能自动播放同时融入网页背景。关于如何在不同设备和浏览器中兼容自动播放,可以看这里 ,今天来谈谈如何在融入背景上做兼容。
mp4视频插入网页后,当需要和背景融合的时候常常会发现颜色不一致,这个问题是如何产生的?有人认为是视频编码时,color range使用的是limited而不是full的原因,也有人认为是浏览器使用了GPU的硬件加速导致的。在这里我并不care这些原因,毕竟作为开发者,既无法要求用户采用同一标准来生产视频,也无法强求用户在浏览的时候使用同一设备同一浏览器。所以,whatever,我们要解决的是,无论什么理由,我们得让视频在网页中融合背景。
我们需要考虑的设备是win,mac,ios,android,浏览器是chrome,safari,firefox,ie。
思路是使用canvas来载入视频,然后读取canvas里的视频背景颜色,再设置到网页的背景颜色中。以此来达到背景色和视频融为一体的效果。
当视频是自动播放时,在IE中无法使用play这个Event来获取视频信息,同时,如果视频跨域,则在IE中无法使用canvas来获取颜色信息。基于此,不考虑在IE中使用canvas。考虑到ie的使用场景几乎只有在win中,且用户数逐日减少,我们不打算考虑太多IE上的兼容可能性。通过在css中,设定网页背景和ie中播放视频的背景色一致的方式,使用ie的大多数用户应该可以确保视频和网页背景是融入的。
除去IE,则其他所有现代浏览器,无论win,mac,ios,android上都是完整支持canvas的,所以兼容起来就简单了。以下为详细思路。
我们找到需要融入背景的视频<video>
标签,在标签之上添加canvas
,设置video在play
事件的时候,使用window.requestAnimationFrame
在canvas上使用drawImage
将视频描绘在canvas画布上。同时抓取canvas上固定的背景点的颜色值,写入网页背景。再将video标签css设置为visibility:hidden;
隐藏显示,即可。
以下是相关代码示例 HTML 1 2 3 4 5 <div class ="video_need_bg" > <div class ="video_in" > <video id ="myVideo" style ="object-fit:fill;" autoplay playsinline preload ="auto" loop muted src ="test.mp4" > Sorry, your browser doesn\'t support embedded videos. </video > </div > </div >
CSS 1 2 3 4 5 6 7 .video_need_bg { background :#000 ; } canvas +video { visibility : hidden; opacity : 0 ; }
JavaScript 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 $('.video_need_bg' ).each (function ( ) { if (getDevice () == 'IE浏览器' ) return ; var that = $(this ); that.addClass ('video_need_bg_ready' ); var v = that.find ('video' ).eq (0 ); var video_v = v[0 ]; var a = that.find ('.canvas_video' ); if (a.length < 1 ) { v.before ('' ); a = that.find ('.canvas_video' ); } var canvas_a = a[0 ]; var ctx = canvas_a.getContext ('2d' ); function init ( ) { canvas_a.width = video_v.videoWidth ; canvas_a.height = video_v.videoHeight ; ctx.drawImage (video_v, 0 , 0 , canvas_a.width , canvas_a.height ); var data = ctx.getImageData (5 , 5 , 1 , 1 ).data ; that.css ('background-color' , 'rgba(' + data[0 ] + ',' + data[1 ] + ',' + data[2 ] + ',' + data[3 ] + ')' ); window .requestAnimationFrame (init); } video_v.addEventListener ('play' , init); $(window ).on ('load' , function ( ) { video_v.play (); }); });