视频转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可以试试哦,大致效果如下:
在这里插入图片描述

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

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

相关文章

网站地址怎么改成HTTPS?

现在,所有类型的网站都需要通过 HTTPS 协议进行安全连接,而实现这一目标的唯一方法是使用 SSL 证书。如果您不将 HTTP 转换为 HTTPS,浏览器和应用程序会将您网站的连接标记为不安全。 但用户询问如何将我的网站从 HTTP 更改为 HTTPS。在此页…

米贸搜|如何“有效利用”Facebook动态广告?!

什么是动态广告? 在我们的日常在线购物经验中,我们经常遇到这样的情况:在某宝平台上浏览或搜索一款产品后,不久你就会发现,平台开始向你推荐与你之前浏览过的商品相似的其他商品。这种商品推荐通常非常符合你的口味&a…

用可视化表单设计轻松实现流程化办公!

在现代化职场办公中,低代码技术平台的利用程度越来越高,成为大家实现流程化办公和数字化转型的友好合作伙伴。作为专业的服务商,流辰信息潜心研发低代码技术平台产品及可视化表单设计工具,轻松助力越来越多行业的客户朋友提高办公…

C语言应用实例——贪吃蛇

(图片由AI生成) 0.贪吃蛇游戏背景 贪吃蛇游戏,最早可以追溯到1976年的“Blockade”游戏,是电子游戏历史上的一个经典。在这款游戏中,玩家操作一个不断增长的蛇,目标是吃掉出现在屏幕上的食物&#xff0c…

多线程事务如何回滚?

背景介绍 1,最近有一个大数据量插入的操作入库的业务场景,需要先做一些其他修改操作,然后在执行插入操作,由于插入数据可能会很多,用到多线程去拆分数据并行处理来提高响应时间,如果有一个线程执行失败&am…

Seata部署

1、下载seata wget https://github.com/apache/incubator-seata/releases/download/v1.4.2/seata-server-1.4.2.zip 2、执行服务端SQL -- -------------------------------- The script used when storeMode is db -------------------------------- -- the table to store Gl…

12306 真的很拉跨吗?春运是对它最大的误解!

春节降至,大家都抢到火车票了吗?马上就要迎来春节,是不是都在吐槽 12306 的种种不好,它真的有这么拉跨吗? 其实不然,每到各种节假日,都是对 12306 最大的误解! 特别是春运&#xf…

多个微信号难管理?

很多客户都遇到了这几个问题: 1、公司分配给员工有很多个微信账号,但是管理起来很难? 2、多个微信号要不来回切换登录,要不需要挂在多台手机了? 3、每个号每天都需要发朋友圈,工作量大?有时还…

GP232RL国产USB串口如何兼容FT232RL开发资料

GP232RL是最新加入 ftdi 系列 usb 接口集成电路设备的设备。 232r是一个 usb 到串行 uart 接口,带有可选的时钟发生器输出,以及新的 ftdichip-idTM 安全加密器特性。此外,还提供了异步和同步位崩接口模式。 通过将外部 eeprom、时钟电路和 …

Java API 操作 HDFS

Java API 操作HDFS一般有两种方式: 使用HDFS客户端配置文件自动配置 Java 代码中配置 一 使用HDFS客户端配置 1.1 下载HDFS客户端配置 1.2 创建Maven项目 创建Maven项目,将下载的客户端配置文件 core-site.xml、hdfs-site.xml 放入resources目录下&…

用AI工具一键生成原创文案的方法

一键生成原创文案对于文案工作者来说它是一种高效率创作文案内容的方法。文案工作者知道创作文案是一件消耗精力和时间的事情,遇到没有创作灵感,想要写一篇高质量的文案内容简直难上加难,因此,互联网上出现了一键生成原创文案的方…

冷知识:COS上传文件时可以同步获取文件信息

背景介绍 本文将介绍如何在上传文件到 COS 时同步获取文件信息,如图片的宽高、格式等。 目前,可以通过 COS 上传接口,如 PUT Object、CompleteMultipartUploads 等将文件存储至 COS 存储桶中,我们针对以下三种场景提供上传时同步…

HubSpot社交媒体影响力怎么样?

HubSpot是一家在数字营销和销售领域非常知名的公司,以其全面的营销、销售和客户服务软件而闻名。然而,关于HubSpot在社交媒体上的具体影响力,这是一个动态的情况,因为社交媒体的影响力可能受到多种因素的影响,包括社交…

如何处理QT 代码复制到新机器无法正确打开和编译?

例如你在文件夹 d:\projects 下创建的项目名称为 hello,这时会在 d:\projects 下创建两个文件夹 d:\projects\hello 和 d:\projects\build-hello-Desktop_Qt_6_6_1_MinGW_64_bit-Debug。其中,第二个文件夹保存了编译器等工具软件的路径设置。 第二个文件…

ubuntu 22安装配置并好安全加固后,普通用户一直登录不上

现象 ubuntu 22安装配置并好安全加固后,普通用户一直登录不上 排查报错 查看日志/var/log/auth.log发现报错 Jan 30 15:49:57 aiv-O-E-M sshd[62570]: PAM unable to dlopen(pam_tally2.so): /lib/security/pam_tally2.so: cannot open shared object file: No …

C语言 | 求最大/小值小技巧:fmax、fmin函数

如果你只是因为不想用C语言手写max、min函数,就直接去用iostream中的max、min函数的话,这篇文章可能会有些许帮助。 😇 fmax、fmin函数用于确定两个指定值的较大/较小值。 头文件 math.h(或者cmath)。 定义 double …

【Python笔记-设计模式】单例模式

一、说明 单例是一种创建型设计模式,能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。 (一) 解决问题 维护共享资源(数据库或文件)的访问权限,避免多个实例覆盖同一变量,引发程序崩溃。 …

部署PXE高效批量网络装机

部署PXE高效批量网络装机 因在Cisco3850核心交换机中已开启DHCP 服务,因此不需要在配置DHCP服务。如果您的网络环境中也已有DHCP服务,也不用再配置DHCP服务了,直接部署PXE相关服务即可。 找一台linux系统的服务器,这本次试验用的是…

什么是零知识证明?

Web3 的核心原则之一——透明度,也可能是其最大的缺点之一。没有人希望他们的所有在线活动(从金融交易到个人身份数据)都可供任何人公开查看。为了使区块链能够扩展并变得更容易访问,隐私必须成为首要任务。 零知识证明能够改变我…

Codeforces Round 894 (Div. 3)

Gift Carpet(Problem - A - Codeforces) 题目大意:有一块儿地毯,上面有n行m列的字符,如果从左往右一列一列的读,可以读到“vika”,那么就输出yes,否则输出no。 思路:这…