芒果团子的博客

使用canvas获取video的第一帧

字数统计: 332阅读时长: 1 min
2018/10/19 Share

video标签在chrome、安卓浏览器、safari默认展示的poster不同。

chrome会自动获取第一帧作为封面,目前遇到的safari同chrome。安卓浏览器中,不设置poster时,显示为空,整个播放器区域黑乎乎一片。

H5中的video标签最好设置poster值,如果只提供了视频链接,可尝试下canvas方法获取第一帧,将其转化为图片。

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
<!-- html部分 -->
<div id="box">
<input type="file" id="file" onchange="changeFileUrl()">
<video src="" id="video"></video>
</div>

<!-- js部分 -->
var $box = document.getElementById('box');
var $video = document.getElementById('video');
var $file = document.getElementById('file'); // 获取dom节点

function changeFileUrl(){
var url = URL.createObjectURL($file.files[0]);
$video.src = url;
}
var cutCover = function(){
// 创建canvas元素
var canvas = document.createElement('canvas');
// 设置canvas宽高度,如果宽高为0,绘制出的url将为空:“data:,”
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);

// 创建img元素
var img = document.createElement('img');
// 使用toDataURL时可能会报错,跨域导致
// Uncaught SecurityError: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.
// 使用crossOrigin解决,需要结合CORS响应头,IE11+、chrome、safari、Firefox
img.crossOrigin = "Anonymous";
img.src = canvas.toDataURL("image/png");
$box.append(img);
}
//
$video.addEventListener('loadeddata',cutCover);
CATALOG