前端方案:播放的视频加水印或者文字最佳实践

前言:

很多时候,视频的转码工作在后端,我们前端是拿到可以播放的链接进行播放即可。但是总是会出现一些定制化的需求,比如在视频的某个区域贴上水印、标识或者文字。这个时候大部分是由前端来操作的。

直接去修改播放器里的东西,不仅难度系数较高,而且危险。毕竟动那种高度集成的东西,一不小心就会破坏原有的样式或者布局。那么让笔者来给大家提供一套简易的手段吧,简单而又实用。

方案:

前端的大伙多多少少都有听说过canvas这个东西吧?是的,笔者的方案就是借助canvas来操作。

思路是这样的,我们用canvas来设置视频播放的区域,然后将视频绘制进canvas里,再将我们想放置进视频里的水印和文字,绘制进canvas的指定区域。其实,本质上,类似于图层的叠加,如下图所示:

 实践源码:

在这里,笔者为了方便,就直接使用html来演示了。

下面将以cadn的logo和一段华山的视频进行合成

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <canvas
      width="600"
      height="400"
      id="c1_box"
      style="border: 1px solid #000"
    ></canvas>
    <button id="btn">播放</button>
  </body>
</html>

<script>
  /** @type {HTMLCanvasElement} */

  var c1 = document.getElementById("c1_box");
  var ctx = c1.getContext("2d");

  var cat_video = document.createElement("video");
  cat_video.src = "./assets/huashan.mp4";

  var btn = document.querySelector("#btn");
  btn.addEventListener("click", () => {
    if (cat_video.paused) {
      cat_video.play();
      render();
    } else {
      cat_video.pause();
    }
  });

  let image = new Image();
  image.src = "./assets/logo.png";

  function render() {
    ctx.clearRect(0, 0, 600, 400);
    ctx.drawImage(cat_video, 0, 0, 600, 400);
    ctx.drawImage(image, 400, 350, 200, 50);
    requestAnimationFrame(render);
  }
</script>

原视频:

加了水印的视频:

源码拆解: 

1.获取canvas的盒子

  var c1 = document.getElementById("c1_box");
  var ctx = c1.getContext("2d");

2.内存中创建video标签,并且注入播放源地址

  var cat_video = document.createElement("video");
  cat_video.src = "./assets/huashan.mp4";

3.赋予播放按钮播放和暂停播放的功能

  var btn = document.querySelector("#btn");
  btn.addEventListener("click", () => {
    if (cat_video.paused) {
      cat_video.play();
      render();
    } else {
      cat_video.pause();
    }
  });

4.内存中创建Image对象,并且赋予其水印地址

  let image = new Image();
  image.src = "./assets/logo.png";

5.渲染函数,将视频资源和水印资源渲染进canvas里

  function render() {
    ctx.clearRect(0, 0, 600, 400);
    ctx.drawImage(cat_video, 0, 0, 600, 400);
    ctx.drawImage(image, 400, 350, 200, 50);
    requestAnimationFrame(render);
  }

到这里,我们对于视频和水印或者文字的结合就演示结束了,那么你学会了吗? 

拓展: 

canvas的优点

Canvas 是一种用于在网页上绘制图形的 HTML5 元素,它具有以下优点:

  1. 高性能:Canvas 提供了高性能的绘图能力,适合处理大量图形和动画。它直接在网页上绘制,不需要额外的插件或库。

  2. 灵活性:Canvas 提供了丰富的绘图功能,包括绘制形状、图像、文本和路径等。你可以通过编程方式控制绘制的细节,实现复杂的图形效果。

  3. 动态更新:Canvas 可以通过 JavaScript 动态更新内容,非常适合实现动画和交互效果。你可以使用 requestAnimationFrame 方法来创建平滑的动画。

  4. 跨浏览器支持:Canvas 在大多数现代浏览器中都有良好的支持,包括移动设备。这使得它成为跨平台开发的一个好选择。

  5. 轻量级:Canvas 是一个轻量级的绘图工具,不需要加载额外的库或插件,可以快速集成到项目中。

  6. 易于学习:Canvas 的 API 相对简单,即使没有图形编程经验的人也能快速上手。它提供了一些基本的绘图函数,如 fillRectstrokeRectdrawImage 等。

  7. 丰富的交互性:通过 Canvas,你可以实现复杂的交互效果,如拖放、点击检测等。你可以通过监听鼠标和触摸事件来响应用户的操作。

  8. 支持离屏渲染:Canvas 支持离屏渲染,可以在后台绘制图形,然后再一次性显示到屏幕上,提高性能。

  9. 支持滤镜和效果:Canvas 提供了一些高级的绘图效果,如滤镜、阴影、渐变等,可以用来创建更加丰富和生动的图形。

  10. 支持矢量图形:虽然 Canvas 本身不支持矢量图形,但可以通过一些技巧(如使用路径和变换)来实现类似的效果。

canvas的适用场景 

Canvas 是一种强大的绘图工具,适用于多种场景,包括但不限于以下几种:

  1. 游戏开发:Canvas 可以用来创建复杂的2D游戏,包括角色、背景、动画和交互元素。它提供了高性能的绘图能力,可以处理大量的图形和动画。

  2. 数据可视化:Canvas 可以用来创建各种数据可视化图表,如折线图、柱状图、饼图等。它支持丰富的绘图功能,可以轻松实现复杂的图形效果。

  3. 图形编辑器:Canvas 可以用来创建图形编辑器,如绘图板、图像编辑器等。它提供了丰富的绘图功能,可以处理各种图形和图像。

  4. 动画和特效:Canvas 可以用来创建各种动画和特效,如粒子系统、火焰、烟雾等。它支持动态更新和交互,可以实现复杂的动画效果。

  5. 实时绘图:Canvas 可以用来创建实时绘图应用,如白板、绘图工具等。它支持动态更新和交互,可以实现实时的绘图效果。

  6. 网页游戏:Canvas 可以用来创建网页游戏,如射击游戏、跑酷游戏等。它支持高性能的绘图和交互,可以实现流畅的游戏体验。

  7. 广告和营销:Canvas 可以用来创建动态广告和营销图形,如滚动字幕、动画广告等。它支持丰富的绘图和动画效果,可以实现吸引人的视觉效果。

  8. 教育应用:Canvas 可以用来创建教育应用,如数学绘图、物理模拟等。它支持丰富的绘图功能,可以用来展示和解释复杂的科学概念。

  9. 艺术创作:Canvas 可以用来创建各种艺术作品,如绘画、雕塑等。它支持丰富的绘图和动画效果,可以实现独特的艺术表达。

  10. 互动艺术:Canvas 可以用来创建互动艺术作品,如互动装置、互动展览等。它支持动态更新和交互,可以实现独特的互动体验。

总之,Canvas 是一种非常灵活和强大的绘图工具,适用于各种需要图形和动画的场景。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/899765.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c语言指针详解2

c语言指针详解2 1.数组名理解 数组名其实是地址&#xff0c;是数组首元素的地址&#xff08;详解1有提及&#xff09; 我们可以根据打印来确认 我们发现数组名和数组⾸元素的地址打印出的结果⼀模⼀样&#xff0c;数组名就是数组⾸元素(第⼀个元素)的地址。 但是上述结论有…

DataX简介及使用

目录 一、DataX离线同步工具DataX3.0介绍 1.1、 DataX 3.0概览 1.2、特征 1.3、DataX3.0框架设计 1.4、支持的数据元 1.5、DataX3.0核心架构 1.6、DataX 3.0六大核心优势 1.6.1、可靠的数据质量监控 1.6.2、丰富的数据转换功能 1.6.3、精准的速度控制 1.6.4、强劲的…

轻松清理 PC 微信文件,释放存储空间

软件介绍 微信在我们的日常生活中使用频率极高&#xff0c;但随着时间的推移&#xff0c;它占用的存储空间也越来越大。以一个使用了两年时间的微信为例&#xff0c;它可能会占用多达几十G的存储空间。其中大部分都是与自己无关的各大群聊中的文件、视频、图片等内容&#xff…

java导出带图形的word

先看效果图&#xff1a;方法都是一样的&#xff0c;所以数据只做了前两组 第一步需要准备模版&#xff1a; 新建一个word插入图表&#xff0c;选择想要的图表。 编辑图表&#xff1a;营业额表示数字&#xff0c;季度表示文字。其他的样式编辑可根据自己的需求更改&#xff0c;…

从 Vue 2 到 Vue 3:全面升级指南

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vuet篇专栏内容:Vue-从 Vue 2 到 Vue 3&#xff1a;全面升级指南 前言 随着前端技术的不断发展&#xff0c;Vue.j…

基于大型语言模型的智能网页抓取

Google Gemini 是 Google AI 创建的大型语言模型 (LLM) 系列&#xff0c;可提供最先进的 AI 功能。Gemini 模型包括&#xff1a; Gemini Ultra — 最大、最强大的模型&#xff0c;擅长处理编码、逻辑推理和创意协作等复杂任务。可通过 Gemini Advanced&#xff08;原名 Bard&a…

FreeRTOS任务状态_改进播放控制 任务管理与调度 空闲任务及其钩子函数 两个Delay函数

任务状态_改进播放控制 FreeRTOS源码概述&#xff08;内存管理&#xff0c;入口函数&#xff0c;数据类型和编程规范&#xff09;创建任务&#xff08;声光色影&#xff0c;使用任务参数&#xff09;删除任务&#xff08;使用遥控器控制音乐&#xff09;-CSDN博客https://blog…

网络信息安全工程师证2024年如何报考?了解这几点让你轻松考证!收藏这一篇就够了

网络信息安全工程师是一种专门从事网络安全工作的职业。随着互联网的快速发展和普及&#xff0c;网络安全问题也日益突出&#xff0c;因此网络信息安全工程师的需求也越来越大。 网络信息安全工程师主要负责保护网络系统和数据的安全&#xff0c;防止黑客攻击、病毒侵入、数据泄…

2.3 塑性力学—等效应力

个人专栏—塑性力学 1.1 塑性力学基本概念 塑性力学基本概念 1.2 弹塑性材料的三杆桁架分析 弹塑性材料的三杆桁架分析 1.3 加载路径对桁架的影响 加载路径对桁架的影响 2.1 塑性力学——应力分析基本概念 应力分析基本概念 2.2 塑性力学——主应力、主方向、不变量 主应力、主…

qt生成uuid,转成int。ai回答亲测可以

// 生成一个随机的UUID QUuid uuid QUuid::createUuid(); // 将UUID转换为字符串 QString uuidStr uuid.toString(QUuid::WithoutBraces);// 计算MD5哈希值 QByteArray hash QCryptographicHash::hash(uuidStr.toUtf8(), QCryptographicHash::Md5);// 提取前8个字节并转换为…

设计模式——装饰者模式(8)

一、定义 指在不改变现有对象结构的情况下&#xff0c;动态地给该对象增加一些职责&#xff08;即增加其额外功能&#xff09;的模式。我们先来看一个快餐店的例子。快餐店有炒面、炒饭这些快餐&#xff0c;可以额外附加鸡蛋、火腿、培根这些配菜&#xff0c;当然加配菜需要额…

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(十二)拓展图优化库g2o(一)框架

【转载】理解图优化&#xff0c;一步步带你看懂g2o框架 文章来源&#xff1a;理解图优化&#xff0c;一步步带你看懂g2o框架 小白&#xff1a;师兄师兄&#xff0c;最近我在看SLAM的优化算法&#xff0c;有种方法叫“图优化”&#xff0c;以前学习算法的时候还有一个优化方法…

BigFoot BigDebuffs

BigFoot BigDebuffs 大脚插件调整目标DOT图标大小&#xff0c;其目标就是让我们自己的DOT图标大一些&#xff0c;而团队其他人小一点&#xff0c;区别开。 178新版魔兽插件站-大脚插件站-178.com BigDebuffs-v41.zip 2024.10.24下载的版本 解压文件后&#xff0c;得到一堆的…

算法魅力-双指针之滑动窗口的叛逆

#1024程序员节#征文 目录 1.滑动窗口的定义 2.算法实战 2.1 长度最小的子数组 算法思路 2.2 无重复字符的最长子串 算法思路 2.3 最大连续 1 的个数 III 算法思路 哈希表的简要补充 结束语 祝大家1024程序节快乐&#xff01;&#xff01;&#xff01; 1.滑动窗口的定…

操作系统笔记(二)进程,系统调用,I/O设备

什么是进程? 一个正在执行的程序一个包含运行一个程序所需要的所有信息的容器进程的信息保存在一个进程表中( Process Table)。进程表中的每一项对应一个进程,称为进程控制块(Process control block,PCB)。 PCB信息包括: 用户ID(UID)、进程ID(PID)…

【开源免费】基于SpringBoot+Vue.JS在线视频教育平台(JAVA毕业设计)

本文项目编号 T 027 &#xff0c;文末自助获取源码 \color{red}{T027&#xff0c;文末自助获取源码} T027&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 新…

黑马JavaWeb-day03

文章目录 Ajax前后端分离开发前端工程化环境准备Vue项目Vue项目开发流程 Vue组件库ElementVue路由打包部署 Ajax Ajax:Asynchronous JavaScript And XML,异步的JavaScript和XML 作用: 数据交换:通过Ajax可以给服务器发送请求,并获取服务器相应的数据异步交互:可以在不重新加载…

1971. 寻找图中是否存在路径

有一个具有 n 个顶点的 双向 图&#xff0c;其中每个顶点标记从 0 到 n - 1&#xff08;包含 0 和 n - 1&#xff09;。图中的边用一个二维整数数组 edges 表示&#xff0c;其中 edges[i] [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点对由 最多一条 边连接&#x…

ShardingSphere 分库分表入门实战

分库分表 需求分析 如果我们的平台发展迅速&#xff0c;用户量激增&#xff0c;从数据库层面去思考&#xff0c;哪个表的数据会最大呢&#xff1f; 回顾一下我们的数据库设计&#xff1a; 1&#xff09;app 应用表 显然不会&#xff0c;成百上千的应用已经多&#xff0c;但…

Chrome DevTools:Console Performance 汇总篇

Chrome DevTools Chrome 开发者工具是一套 Web 开发者工具&#xff0c;直接内置于 Google Chrome 浏览器中。 开发者工具可以帮助您即时修改页面和快速诊断问题&#xff0c;最终帮助您更快地构建更好的网站。 一、开启 DevTools 右上角菜单 > 更多工具 > 开发者工具 页面…