视频转GIF动图实践, 支持长视频转GIF

背景

找了很多GIF动图制作的工具,比如将视频转成GIF, 或者将一系列图片转成GIF, 增加背景文案等等功能。很多收费或者用的一些三方库有点点卡顿,或者需要安装一个软件,所以就自己做一款纯前端页面级别的 视频转 GIF 动图工具。

最开始找到一款可使用的库 gifshot, 该库最后一个版本在 2017 年(这篇文档记录截止查看的时间)。该包提供了示例, 其实支持的功能还挺多的,如下:

  1. 可以指定图片链接生成 GIF
  2. 可以上传视频生成 GIF
  3. 一边录制视频生成 GIF

不过也有一些缺点,查看源码可知,内部实现的时候,是在 omggif 库的基础上, 使用 canvas 对视频流进行截取, 然后通过 getImageData 获取图片资源, 再次进行视图转化后 交给 omggif 一张张图片追加上去 (当然源码中将 omggif 库部分代码直接拷贝下来的), 最终通过生成 base64格式的 GIF 资源。

gifshot 使用过程中遇到的自己感觉体验不好的点
  1. 该包可能很多年没有更新维护了, 内部做了很多兼容性处理, 最后一步生成的 base64 如果 GIF 图片较大这个还是挺大的, 可以使用别的方法可能更佳, 不需要各种数据格式转化
  2. 有点点卡顿, 该库的生成流程是,根据视频流或者给出的图片列表, 首先使用 canvas 绘制得到图片数据, 然后开启多个 worker 线程 将图片数据转成 omggif 支持的视图数据格式。到这一步可能不会卡, 且有进度提示。不过从源码中能看到, AnimatedGIF 构造函数中 generateGIF 方法使用 omggif 写入每一张图片数据时, 没有做任务调度, 一次性全部写入, 如果稍微长点的视频, 有个三五百张图片, 这一步会导致页面短暂卡顿无法交互
  3. 假如想自己根据 canvas 截取的图片资源来生成 GIF, 只能调用canvas的toDataURL生成图片资源列表传进去, 内部还会走一遍 canvas 截取过程, 这样自定义的情况稍微较慢了
  4. 功能揉合在一个包中, 其实很强大。 不过如果想要分开使用某些功能, 比如想自定义截取(包括从视频流, 图片集), 然后只提供处理 canvas 生成的 Uint8ClampedArray 图片数据的功能, 这样就是一个纯 js 功能, 不包括 window, canvas等元素的引用, 能全部在 worker 中使用处理了

鉴于上述的一些情况, 所以就基于 omggif 库, 参考 gifshot 库(其中多线程生成图片特征很不错), 在项目中做一款纯 js 的专门处理 canvas 调用 getImageData 方法得到的数据的工具类了, 其他的功能比如 截取视频流, 截取图片列表等等, 来源根据各自的使用场景自定义。该工具类只处理 ImageData 资源。

自定义GIF图片生成

鉴于上述, 基于omggif自定义一个生成GIF的功能模块,实际上,将该库部分功能截取下来了。自定义GIF生成主要分如下两个部分功能

  1. 纯 js 处理 ImageData 图片资源工具, 比如定义名称 gif-tool(仅在该文中称呼), 只提供底层功能, 处理数据
  2. 基于该 js 工具做的跟 DOM 相关的组件功能,可以定义一系列参数。根据各种来源生成待处理的特征

gif-tool 可以完全在 woker 中运行, 这样就能将整个 图片资源转化和图片生成 GIF 放在独立线程处理了。不过此处图片特征处理比较耗时, 且可以不按顺序处理, 将这个流程交与子线程处理就好了, 其他的进行任务调度。

图片资源特征抽取比较耗时间, 并且与顺序无关, 参考 gifshot 的方式, 开多个线程处理。生成的图片特征生成GIF, 不能遍历直接生成, 通过任务调度的方式来生成, 以免造成页面卡顿, 且每完成一张就可以将进度显示在页面, 优化体验效果。

方案选取,主要有两种方式
  1. 一次截取全部图片数量, 然后全部处理完交给下一个步骤,问题是占用内存大, 但图片数量有个总览, 且图片不是太多时也不会出现大问题。
  2. 批量处理, 生成一批, 处理一批, 处理完后回删,这样就不用一次性处理很多图片, 内存占用上会好很多。

因为生成的GIF也不宜过大,且可以支持截取对应的视频区间以及长视频模式处理,所以直接一次性生成,没有分批处理。不过实际工作项目中肯定需要做demo进行对比。

所以选取的整体流程是 截取屏幕瞬间 -> 生成图片数据列表 -> 处理图片特征 -> 增加每一张图片为 GIF 播放瞬间以及停留时间设置 -> 生成供下载的GIF链接

页面信息显示大概如下, 截取图片的数量, 通过帧率来设置截取频率, 展示频率默认一帧等等。支持大时长视频生成GIF预览, 也就是长视频模式。

在这里插入图片描述

交互体验

生成的时候可以明确的看到各个阶段的进度,以及每次设置之后预估的截取数量,如果想截取视频中某一段或者某个范围,可以对时间和区域进行裁剪,效果如下:
在这里插入图片描述

其他优化: 目前只做简单的提示,比如多少张可能会卡,实际上可以做更详细的优化,比如预计截取多少张图片会导致卡顿, 预计会截取多少资源到内存等等,从而提示截取帧数是否需要修改。

其他一些小功能点设想

因为可以完全自定义绘制部分, 所以想要追加啥东西都可以, 最终给 gif-tool 工具处理图片资源即可。

  • 各种文字特效, 比如出现时机和消失的时机
  • 插入小图标且做播放动效
  • 播放/停止视频, 快进到某个节点等各种方式的生成
  • 在某个时间段展示一些自定义的内容
  • … 等等一系列的小功能点, 比较简单只不过要花时间测试和调试

因为暂时没有用到, 所以就没做了,方案详细记录。

最后在线免费体验地址www.nqone.com/gif,如果想要将某些录取的视频操作生成GIF可以试试哦,大致效果如下:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解析PDF二维码:数字时代文件管理的创新之道

随着数字时代的来临,文件管理方式正经历着翻天覆地的变革。在这个变革的浪潮中,PDF二维码作为一种创新的技术手段,正逐渐引起人们的关注。本文将深入探讨PDF二维码的概念、应用领域以及在文件管理中的前景。 一、PDF二维码的概念 PDF二维码…

Datawhale 组队学习之大模型理论基础Task9 大模型法律

第11章 大模型法律 11.1 简介 此内容主要探讨法律对大型语言模型的开发和部署有何规定。 先看看法律的特点: 法律就如我国法律教材所给出的一样,有依靠国家强制力保证实施的特点。 而法律在大模型中也是不可或缺的,缺少了法律的约束&…

chromedriver安装和环境变量配置

chromedriver 1、安装2、【重点】环境变量配置(1)包的复制:(2)系统环境变量配置 3、验证 1、安装 网上随便搜一篇chromedriver的安装文档即可。这里是一个快速链接 特别提醒:截止2024.1.30,chr…

LeetCode.209. 长度最小的子数组

题目 题目链接 分析 本题的题意就是让我们找最短的子数组和 > target 的子数组的长度。 首先最能想到的就是暴力方法,外层循环以数组每一个元素都作为起点,内存循环累加元素,当大于等于 target 的时候记录当前元素个数,更新…

力扣(leetcode)第119题杨辉三角II(Python)

119.杨辉三角II 题目链接:119.杨辉三角II 给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1] 示例 2: 输入: rowIndex 0…

机器人顶会IROS,ICRA论文模板下载及投稿须知,以及机器人各大会议查询

一、背景 机器人方向,不止期刊TRO,TASE,RAM,RAL上的成果被认可,机器人顶会上的成果也是非常好的。当决定要写一篇IROS论文时,结果IROS论文模板和投稿须知找了半天才找到,且意外发现了一个特别好…

Consul容器服务自动发现和更新

目录 前瞻 什么是服务注册与发现 什么是consul Docker-consul实现过程 Docker-consul集群部署 实验准备 实验流程 前瞻 什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服…

企业到底怎么选择PaaS服务?

近年来,云计算一直保持着强大的生产力和创造力,为科技的进步和社会的发展提供了强大的平台。 企业在使用云的时候,会选不同的模式,而PaaS方案,可以为企业的业务需求提供更有效的云计算支持。 PaaS意为平台即服务&…

Web3创业:去中心化初创公司的崛起

随着Web3时代的到来,去中心化技术的崛起不仅令人瞩目,也为创业者带来了前所未有的机遇。在这个新的时代,一批去中心化初创公司正崭露头角,重新定义着商业和创新的边界。本文将深入探讨Web3创业的趋势,以及去中心化初创…

基于数字签名技术的挑战/响应式认证方式

挑战/响应式认证方式简便灵活,实现起来也比较容易。当网络需要验证用户身份时,客户端向服务器提出登录请求;当服务器接收到客户端的验证请求时,服务器端向客户端发送一个随机数,这就是这种认证方式的“冲击&#xff08…

OpenCV 8 - 模糊处理(均值滤波,高斯滤波,中值滤波,双边滤波)

模糊处理原理: Blur是图像处理中最简单和常用的操作之一,使用该操作的原因为了给图像预处理时候减低噪声使用,Blur操作其背后是数学的卷积计算, 通常这些卷积算子计算都是线性操作,所以又出线性虑波。 假设有6x6的图像像素点矩阵。卷积过程:6x6上面是个3x3的窗口,从左向右,…

秒级响应,显著增效:明日控股携手奇点云,打造大宗贸易的数据中台标杆

业务流程复杂、场景个性化、交易金额大、高度依赖人工的大宗贸易行业也能做到业务实时分析,甚至还能自动化? 这样的图景在三年前,只是不太现实的假想。 明日控股集团(浙江明日控股集团股份有限公司)IT团队曾坦言&…

使用WAF防御网络上的隐蔽威胁之反序列化攻击

​ 什么是反序列化 反序列化是将数据结构或对象状态从某种格式转换回对象的过程。这种格式通常是二进制流或者字符串(如JSON、XML),它是对象序列化(即对象转换为可存储或可传输格式)的逆过程。 反序列化的安全风险 反…

多线程(Day22)

死锁 概述 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或由于彼此通信而造成的一种阻塞现象。若无外力作用,他们将无法进行下去,此时称系统处于死锁状态,这些永远在互相等待的进程称为死锁进程。 原理 1 某个线程执行…

Docker(第三部分)

1,Docker复杂安装说明 今天的优势会被明天趋势所取代 一切在云端 安装mysql主从复制 主从复制原理,默认你懂 主从搭建步骤 1,新建主从服务器容器实例3307 docker run -p 3307:3306 --name mysql-master\ -v /mydata/mysql-master/log:…

一二三应用开发平台文件处理设计与实现系列之7——minio多节点共享磁盘模式验证

背景 在不了解minio架构设计之前,我根据既往经验推测minio是将文件读写封装实现了一个应用系统,如要实现高可用,则需要部署两个minio节点,共享同一块磁盘。两个minio节组成一个集群,使用nginx实现负载均衡&#xff0c…

【C深度解剖】const关键字

简介:本系列博客为C深度解剖系列内容,以某个点为中心进行相关详细拓展 适宜人群:已大体了解C语法同学 作者留言:本博客相关内容如需转载请注明出处,本人学疏才浅,难免存在些许错误,望留言指正 作…

菜单栏应用管理 -- Bartender 4

Bartender 4是一款旨在优化和简化Mac菜单栏管理的强大工具。它具有以下特色功能: 组织和管理菜单栏图标:Bartender 4允许用户轻松组织和管理菜单栏中的图标,可以隐藏不常用的图标,保持菜单栏的整洁和简洁。同时,用户还…

雾锁王国多人联机专用服务器推荐!最高支持16人联机

Steam平台24日新上线一款奇幻生存冒险建造动作RPG游戏《ENSHROUDED雾锁王国》,玩家将置身于一个广阔的可编辑改造的体素世界中,在被灾祸笼罩的先祖之地上展开生存之旅。在《雾锁王国》中,玩家可以独自冒险,也可以与最多16名玩家联…

Ajax入门与使用

目录 ◆ AJAX 概念和 axios 使用 什么是 AJAX? 怎么发送 AJAX 请求? 如何使用axios axios 函数的基本结构 axios 函数的使用场景 1 没有参数的情况 2 使用params参数传参的情况 3 使用data参数来处理请求体的数据 4 上传图片等二进制的情况…