Html
    Css
    Js

    
                        
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;
}

                        
↑上面代码改变,会自动显示代码结果 jQuery调用版本:2.0.0
 立即下载

H5 Video截取第一帧 Canvas 动态视频渲染、截取

前言:

在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)跨域问题,请将资源放在同一域名下再试。

0