提示💡 drawImage、requestAnimationFrame 隐藏video 在使用网页播放视屏是常常会有写原生视频标签无法做到的事,比如在手机播放时可能会被手机播放器接管播放,或者加些弹幕,或者自定义些控件。 <div> <video id="myVideo" width="400px" height="225px" autoplay="autoplay" muted controls crossorigin="anonymous" > <source src="https://lf3-static.bytednsdoc.com/obj/eden-cn/nupenuvpxnuvo/xgplayer_doc/xgplayer-demo.mp4" /> 您的浏览器不支持 HTML5 video 元素。 </video> </div> <!-- 自定义 Canvas 播放 --> <!-- <p>Canvas 显示:</p> --> <!-- <canvas width="400px" height="225px"></canvas> --> class Video2Canvas { static PLAY_STATUC = { PLAY: 1, PAUSE: 0 }; constructor(video, canvas) { this.statuc = Video2Canvas.PLAY_STATUC.PAUSE; this.video = video; // 自动创建Canvas if (!(this.canvas = canvas)) { this.canvas = document.createElement("canvas"); this.canvas.width = video.clientWidth; this.canvas.height = video.clientHeight; this.canvas.className = video.className; video.style.display = "none"; video.parentNode.appendChild(this.canvas); } this.c2d = this.canvas.getContext("2d"); this.video.addEventListener("play", this.play.bind(this)); this.video.addEventListener("pause", this.pause.bind(this)); } render() { if (this.statuc == Video2Canvas.PLAY_STATUC.PLAY) { this.c2d.clearRect(0, 0, this.canvas.width, this.canvas.height); this.c2d.drawImage( this.video, 0, 0, this.canvas.width, this.canvas.height ); requestAnimationFrame(this.render.bind(this)); // 渲染视频帧 } } play() { console.log("播放"); if (this.video.paused) this.video.play(); this.statuc = Video2Canvas.PLAY_STATUC.PLAY; this.render(); return this; } pause() { console.log("暂停"); if (this.video.played) this.video.pause(); this.statuc = Video2Canvas.PLAY_STATUC.PAUSE; return this; } } // 使用方法:1 const video = document.querySelector("video"); // 获取到视频标签 // 实例化 Canvas 对象并播放,该操作会自动创建一个 Canvas 标签放到 video 标签同级并隐鲹原有的 video 标签 const v2c = new Video2Canvas(video).play(); // 使用方法:2 // const video = document.querySelector("video"); // 获取到视频标签 // const canvas = document.querySelector("canvas"); // 获取到自己准备好的canvas标签 // 实例化 Canvas 对象并播放 // const v2c = new Video2Canvas(video, canvas).play(); 扩展阅读 使用 canvas 处理视频 使用原生 Canvas 播放视频‘ canvas_video.js: 一个用canvas来播放视频的小插件,主要应用于移动端微信。 canvas绘制video 用canvas实现视频播放与弹幕功能