惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
Stack Overflow Blog
Stack Overflow Blog
B
Blog RSS Feed
C
Check Point Blog
D
Docker
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
Google DeepMind News
Google DeepMind News
MongoDB | Blog
MongoDB | Blog
博客园_首页
Apple Machine Learning Research
Apple Machine Learning Research
量子位
有赞技术团队
有赞技术团队
IT之家
IT之家
大猫的无限游戏
大猫的无限游戏
D
DataBreaches.Net
M
MIT News - Artificial intelligence
B
Blog
阮一峰的网络日志
阮一峰的网络日志
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
腾讯CDC
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
V2EX
月光博客
月光博客

博客园 - Zion0707

Codex接入DeepSeek token实现对话与操作,so easy! Openclaw只能聊天不能操作解决方案 Ubuntu从零搭建Openclaw Openclaw安装问题记录 React数字滚动,增加或减少效果 react hooks实现对元素拖拽及鼠标滚轮缩放 前端实现图片文字识别并提取 ECharts实现两条曲线数据比较,数据高出区域高亮显示 fabricjs实现虚线流动动画效果 React国际化方案及示例 fabricjs如何导入echarts fabricjs元素对齐方式实现 萤石云视频监控和回放方案 React仿photoshop参考线功能 react-router-dom v6 使用 “DatePicker”不能用作 JSX 组件。 Element plus的tree组件实现单选和搜索功能 16进制相关操作方法 js 版 AES-128 算法加解密 js 版 React 下拉多选,全选/全不选功能组件
canvas实现视频播放并支持自动播放
Zion0707 · 2023-08-02 · via 博客园 - Zion0707

背景:

在工作中很多时候会遇到大屏首页需要酷炫的动态背景,很多时候酷炫的动效用css和js比较难于实现。此时就会产生两种方案,第一种是采用gif,第二种会采用video方案。

但是第一种方案有时候导出的 gif 图片往往会比较大,在首屏加载有时候会不太理想,资源比较大在加载时会出现一卡一卡的现象,体验不太友好。此时就衍生除了第二种方案视频播放方案,但是如果直接使用video标签去播放会出现浏览器的一些兼容性问题和样式不统一问题,还有就是层级有时候会在最顶端遮盖了其他元素,导致不好的效果,这时就要采用canvas去播放视频来解决这些问题了。

选择方案:

video + canvas

简单示例:

代码实现:

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=`, initial-scale=1.0">
    <title>canvas实现视频播放并支持自动播放</title>
</head>
<body>
  <canvas id="canvas" width="640px" height="360px"></canvas>

  <script src="./index.js"></script>  
</body>
</html>

index.js

window.onload = () => {
  
  // 创建一个虚拟video元素
  const videoEl = document.createElement("video");
  videoEl.src = "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4";

  // 重要:由于浏览器限制自动播放问题,则需要使用无声播放即可实现自动播放
  videoEl.muted = "muted"; 
  videoEl.autoplay = "autoplay";
  videoEl.loop = "loop";
  videoEl.play();


  // 创建canvas
  const canvas = document.getElementById("canvas");
  const cvsWidth = canvas.width;
  const cvsHeight = canvas.height;
  const ctx = canvas.getContext("2d");

  // 使用requestAnimationFrame定时器实现canvas绘制video每一帧
  const videoRender = () => {
    window.requestAnimationFrame(videoRender);
    ctx.clearRect(0, 0, cvsWidth, cvsHeight);
    ctx.drawImage(videoEl, 0, 0, cvsWidth, cvsHeight);
  };
  videoRender();
  
};