使用canvas模拟一个video标签中的视频播放
HTML结构以及样式
老旧的安卓微信中播放视频时总是会自动在新窗口全屏播放视频,而且播放结束后自动推送多个视频列表展示给用户选择,但有时候我们就是需要视频能够局部区域播放。除了设置x5等标签外,我们也可以使用canvas去模拟一个视频播放。
<video id="testVideo"
x5-video-player-type="h5"
x5-video-player-fullscreen="true"
playsinline="true"
webkit-playsinline="true"
src="http://v.qdxin.cn/v/2021/20210430-pingdudaodeyinhang-s.mp4"
></video>
<canvas id="testCanvas"></canvas>
<button id="btn-play">播放</button>
<button id="btn-pause">暂停</button>
<style type="text/css">
video{display:none}
</style>
基本JS
//获取video
var TestVideo=document.getElementById("testVideo");
//获取canvas画布
var TestCanvas=document.getElementById("testCanvas");
//设置画布
var TestCanvas2D=TestCanvas.getContext('2d');
//设置setinterval定时器
var TestVideoTimer=null;
var btnPlay = document.getElementById('btn-play');
var btnPause = document.getElementById('btn-pause');
var videoW = 300;
var videoH = 200;
btnPlay.addEventListener('click', function() {
TestVideo.play();
});
btnPause.addEventListener('click', function() {
TestVideo.pause();
});
//监听暂停
TestVideo.addEventListener('pause',function() {
clearInterval(TestVideoTimer);
},false);
//监听结束
TestVideo.addEventListener('ended',function() {
clearInterval(TestVideoTimer);
},false);
使用定时器setInterval
//监听播放
TestVideo.addEventListener('play',function() {
TestVideoTimer=setInterval(function() {
TestCanvas2D.drawImage(TestVideo, 0, 0, videoW, videoH);
},20);
},false);
这里用了定时器,每20毫秒刷新一次画布,将视频画面画到画布上。
在线效果:使用定时器
【推荐】使用屏幕刷新率requestAnimationFrame
// 使用requestAnimationFrame制作循环
function renderAni(callback) {
function draw() {
callback();
requestAnimationFrame(draw);
}
var requestAnimationFrame = window.requestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.msRequestAnimationFrame;
requestAnimationFrame(draw);
}
TestVideo.addEventListener('play',function() {
renderAni(function() {
TestCanvas2D.drawImage(TestVideo, 0, 0, videoW, videoH);
});
},false);
这里用了新的浏览器API,每次屏幕刷新的时候,自动执行画布的绘制。是比较推荐的方法。执行效率要比定时器要好。