html,body { width:100%; height:100%; text-align:center; } li { position:relative; display:inline-block; list-style:none; } canvas,img { width:400px; height:220px; border:1px solid darkgray; } button { padding:6px 20px; margin:6px 3px; }
在Web开发过程中,由于现在的新媒体技术、资源、客户体验、需求等也越来越广、多、高,作为HTML5中较为重要的 新媒体video视频API,也是用得非常之多。比如之前有个项目要在微信中做直播(半屏)播放(rtmp, m3u8等视频流),在IOS手机还好(听说ios手机微信没那么大的操控权限),而在Android手机下(Android系统毕竟是开源产品), 只要在微信X5内核浏览器中播放视频 就会自动全屏,而且z-index层级也是最高的(当然以qq.什么的域名的视频就不全屏,这是腾讯自已的东西,爱怎么搞就怎么搞咯!我们第三方开发者也没办法,后来他们又搞了一个同层策略 在video标签中加上 x5-video-player-type="h5" 属性,然而还是有一堆这那样的问题),然后不能发东西,打字聊天等【如有朋友已经解决的情况下,还请多多指教,在此先谢过了!!!】, 还有前两天有个项目就用到了, 其中有个需求就是要获取html5的video视频第一帧作为播放前的图片,还有自定义控制相关播放按扭等等。所以就和大家一起分享。如有更好解决办法的朋友,欢迎指导!
主要是靠canvas中的
canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);
这个方法可以根据图片,视频等进行绘制图片(也可反复重绘),而
canvas.toDataURL("image/png", 1)
可以得到canvas所绘制的图像(Base64)。无论是抓取图片 或 动态加载视频 都一样,其区别就在于:如果是抓取(图片)一帧就是只获取一次
canvas.toDataURL("image/png", 1)
而如果是加载视频的话就设置一个定时器不停的canvas.toDataURL("image/png", 1)抓取每帧的画面。
最后将其添加到Canvas画布, img标签,甚至div、body等标签元素的src属性 或 url背景里面都是可以的 [在这里用了 img、canvas 以及body] 这3个标签来做的实例。
方法虽然好用但是canvas.toDataURL("image/png", 1);有一个问题就是不能跨域获取,简间来说就是所抓取的视频文件和执行抓取的html文件页面要在同一个域里才行。还有就是当Canvas所渲染元素如Canvas画布, img标签,div标签、body 标签等太多了的情况下,页面就会出现卡顿现象。
第一个toDataURL("image/png", 1)跨域问题,我在网上找了好多办法,如:
image.setAttribute('crossOrigin', 'anonymous');
等都不管用。最后就不跨域,把要抓取的视频文件和执行抓取的html文件页面都放在同一个域名下。【如有朋友已经解决的情况下,还请多多指教,在此先谢过了!!!】
问题2
渲染元素太多,有卡顿现象,经测试将toDataURL("image/png", 1)输出的图像作为背景的形式给元素添加稍微好点,但实在多了也还是会卡顿的(当然这也和每个人所使用的电脑性能也有点关系的)。
1、在代码中已经有非常详细的注释和说明。
2、该功能除jQuery以外,没有使用其他任何插件。
3、如在使用时遇到上而所说toDataURL("image/png", 1)跨域问题,请将资源放在同一域名下再试。