首页 > 其他分享 >前端方案:播放的视频加水印或者文字最佳实践

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

时间:2024-10-26 20:50:39浏览次数:3  
标签:动画 Canvas 前端 canvas video 加水 绘图 图形 播放

前言:

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

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

方案:

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

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

实践源码:

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

下面将以csdn的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 video = document.createElement("video");
  video.src = "./assets/huashan.mp4";

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

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

  function render() {
    ctx.clearRect(0, 0, 600, 400);
    ctx.drawImage(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 video = document.createElement("video");
  video.src = "./assets/huashan.mp4";

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

  var btn = document.querySelector("#btn");
  btn.addEventListener("click", () => {
    if (video.paused) {
      video.play();
      render();
    } else {
      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(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 是一种非常灵活和强大的绘图工具,适用于各种需要图形和动画的场景。 

标签:动画,Canvas,前端,canvas,video,加水,绘图,图形,播放
From: https://blog.csdn.net/yxlyttyxlytt/article/details/143213827

相关文章

  • 如何搞定所有 Web 前端面试题
    如何搞定所有Web前端面试题TIP工作能力≠面试能力,面试之前刻意练习,强化训练。聚焦前端面试必考的刚需内容,掌握解决面试题的思路、技巧与方法论。一、方法论总结首先要清楚企业对于工程师能力要求,自身能力素养及面试招聘流程1、企业招聘工程师的三个级别面试考察......
  • java+vue计算机毕设纯音乐播放网站【开题+程序+论文+源码】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,音乐已成为人们日常生活中不可或缺的一部分。纯音乐,以其独特的旋律和氛围,不仅能够舒缓压力、激发灵感,还能在特定情境下营造......
  • Long类型后端到前端精度丢失问题
     在开发中,后端经常需要处理一些大数值的Long类型数据(id等)。但当这些数据通过接口传递到前端时,可能会出现精度丢失的问题。原因:JavaScript的Number类型遵循IEEE754双精度浮点数标准,只能精确表示范围在-(2^53-1)到2^53-1之间的整数(约等于-9007199254740991......
  • uniapp精仿微信源码,基于SumerUI和Uniapp前端框架的一款仿微信APP应用,界面漂亮颜值高,视
    uniapp精仿微信源码,基于SumerUI和Uniapp前端框架的一款仿微信APP应用,界面漂亮颜值高,视频商城小工具等,朋友圈视频号即时聊天用于视频,商城,直播,聊天,等等场景,源码分享sumer-weixin介绍uniapp精仿微信,基于SumerUI3.0和Uniapp前端框架的一款仿微信APP应用,界面漂亮颜值高,视频......
  • 021、深入解析前端请求拦截器
    目录深入解析前端请求拦截器:1.引言2.核心实现与基础概念2.1基础拦截器实现2.2响应拦截器配置3.实际应用场景3.1完整的用户认证系统3.2文件上传系统3.3API请求缓存系统3.4请求重试机制3.5国际化处理4.性能优化实践4.1请求合并(RequestBatching)4.2......
  • FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
    ​ijkplayer是Bilibili公司(简称B站)基于FFmpeg3.4研发并开源的国产播放器,它可运行于Android和iOS系统,既支持播放本地视频文件,也支持播放网络上的流媒体链接。之前的文章《Linux编译ijkplayer的Android平台so库》介绍了如何编译获得App工程所需ijkplayer的so文件,接下来还要把官方......
  • [Vite] 优化前端打包
    按需加载组件router这里使用动态路由引入,如component:()=>import("@/views/Index.vue")JPG、PNG、SVG等图片资源的压缩Gzip压缩js、css、html,也要配置Nginx的gzipimport{defineConfig}from"vite";importvuefrom"@vitejs/plugin-vue";importAutoImpo......
  • 前端开发设计模式——工厂模式
    目录一、定义和特点1.定义2.特点二、实现方式三、使用场景1.创建复杂对象2.根据不同条件创建对象四、优点1.代码复用2.解耦对象创建和使用3.易于维护五、缺点1.增加代码复杂度2.工厂函数可能变得臃肿六、注意事项1.命名规范2.单一职责原则3.错误......
  • Cortex-A53高端智能影音融合播放系统
    1.1项目背景及目标        随着信息技术的飞速发展,多媒体数据已成为人们日常生活和工作的重要组成部分,用户对于音视频播放软件的需求日益增长。然而,目前市面上的多媒体播放器在功能、性能、用户体验等方面存在较大差异,许多播放器无法满足用户多样化的播放需求。为了填......
  • 前端针对 XSS 安全配置
    参考https://layui.dev/notes/share/security-currentscript.htmlhttps://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSPhttps://cloud.tencent.com/developer/article/2281491起因从Layui网站上看到XSS漏洞问题,了解到可以使用CSP防御XSS攻击方法正文还可以指......