用FFmpeg制作WebP动图

2023-11-17

去年写过一篇文章,是教大家用FFmpeg制作GIF动画的。今天在讨论到项目中碰到的一个.apng动画素材引起的程序崩溃时,有位同学建议:我们为啥不用WebP来代替.apng?是啊,why not?

网上搜到一篇文章。自己试了一下,发现强大的FFmpeg果然支持制作WebP动图,于是顺手做了些笔记。

先来试一下这条命令:

ffmpeg -ss 25 -t 5 -i D:\Media\bear.wmv -vf scale=240:-1 -r 10 -lossless 1 -loop 0 -y D:\bear-lossless.webp

意思是:D:\Media目录下的源文件bear.wmv,从第25秒的位置开始,截取5秒长度的视频,画面宽度按比例缩放到240像素,并且控制输出帧率为10fps后转成webp文件,最终保存为D:\bear-lossless.webp。注意到,我们这次用的是无损压缩(-lossless 1),并且生成的动画是无限循环播放的(-loop 0)。

当你迫不及待地找到新鲜生成的bear-lossless.webp文件,双击鼠标,弹出了系统默认的看图软件——呃,怎么不是动画呀?莫急!那只是因为你用的看图软件太菜了。将bear-lossless.webp文件拖进Chrome浏览器吧,马上就看到效果了!

既然提到了无损压缩,接下来我们再试试有损压缩吧,这时用到了qscale质量因子,它的取值范围为0-100,数值越高图像质量越好。我们用80来试试,命令行如下:

ffmpeg -ss 25 -t 5 -i D:\Media\bear.wmv -vf scale=240:-1 -r 10 -qscale 80 -loop 0 -y D:\bear-q80.webp

作为对比,我们用相同的这段视频生成一个GIF动画,命令行如下:

ffmpeg -ss 25 -t 5 -i D:\Media\bear.wmv -vf scale=240:-1 -r 10 -y -f gif D:\bear.gif

对比后发现,无损压缩的bear-lossless.webp文件最大,有1.3MB;采用有损压缩后,bear-q80.webp文件变小了很多,只有177KB;而同样较小的bear.gif文件(仅154KB),图像质量明显差于bear-q80.webp。说明什么问题?WebP压缩算法优秀啊!

bear-lossless.webp
bear-q80.webp
bear.gif

回到实际的软件项目中来,我们要用的WebP能从视频中抽取出来吗?通常情况不是这样的。设计师往往会制作完整动画过程所对应的一系列静态图片。那么,怎样把这个图片序列生成一个WebP动图呢?其实也很简单,命令行如下:

ffmpeg -f image2 -framerate 10 -i D:\Media\pics\cache_loading_%02d.jpeg -loop 0 -y D:\loading.webp

意思是:将设计师制作的动画单帧图片分别按照cache_loading_xx.jpeg格式命名,其中xx是连续的两位整数,并把这些文件都放在同一个文件夹下。执行上述命令后,这些静态文件按照帧率10fps生成一个WebP动图文件D:\loading.webp。

设计师制作的原始素材须规范命名

很棒哦,快把loading.webp拖进Chrome浏览器看看吧!对比文件大小(loading.apng 81KB vs. loading.webp 42KB),差不多缩减了一半,满满的惊喜!

loading.webp

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用FFmpeg制作WebP动图 的相关文章

  • Java ImageWriter BufferedImage 到 GIF

    我希望你们能帮我解决这个问题 我不确定这是 Java 中的错误还是我做错了什么 但我会选择后者 我想将 BufferedImage 转换为 GIF 图像 然后我希望将 GIF 以字节数组的形式保存在内存中 我不想将文件保存到磁盘 该程序应该
  • Python 子进程中的 ffmpeg - 无法找到“管道:”的合适输出格式

    尝试通过 Python 使用 ffmpeg 将字幕刻录到视频中 在命令行中工作正常 但是当从 Python 子进程调用时 p subprocess Popen cd Downloads yt ffmpeg i video vf subtit
  • 在 Android 4.1/4.2 设备中使用 MediaCodec.getOutputFormat() 作为编码器的问题

    我正在尝试使用 MediaCodec 将帧 通过相机或解码器 编码为视频 当通过 dequeueOutputBuffer 处理编码器输出时 我期望收到返回索引 MediaCodec INFO OUTPUT FORMAT CHANGED 因此
  • 使用 ffmpeg 进行视频标准化

    无论如何 有没有使用 ffmpeg 脚本将视频亮度标准化为其完整的动态范围 我一直在尝试用 lutyuv 这样做 ffmpeg i input mp4 vf lutyuv y val minval 255 maxval minval 输出
  • 我可以从带时间戳的图像创建 VFR 视频吗?

    首先 我对图像制作视频的经验几乎为零 我拥有的是一组带有 BMP 时间戳的图像 我想从中生成视频 由于时间戳的间隔不相等 我不能简单地使用从图像创建恒定帧速率视频的软件 一个可能的解决方案是在固定的时间间隔创建人造图像 但如果我无法制作 V
  • ffprobe/ffmpg 静音检测命令

    我正在研究流静音检测 它正在 ffmpeg 中执行以下命令 ffmpeg i http mystream com stream af silencedetect n 50dB d 0 5 f null 2 gt log txt 我想获得日志
  • ffmpeg drawtext如何设置从右到左的方向

    i write arabic text to videos and it works fine but the issue is that the arabic language is written from right to left
  • 使用 ffmpeg 转换真实媒体

    我有许多旧的硬壳真实媒体文件需要转换 并希望编写一个脚本来批量处理它们 我可以使用 FFMpegX 进行 Real Media gt AVI 转换 但是当我尝试使用 ffmpeg 复制转换时 它总是会出现如下错误 avi 0x10084fa
  • 如何使用ijkplayer库

    我要使用 ijkplayergithub链接 https github com bbcallen ijkplayer 我下载了这个 然后通过 文件 gt 导入 gt 常规 gt 现有项目到工作区 将其导入到 eclipse 中 之后我有三个
  • C# 从视频文件的一部分中提取帧

    使用 AForge ffmpeg 包装器 您可以使用 VideoFileReader 类从视频中提取帧并将其保存为位图 请参阅以下示例 提取 avi 文件的帧 https stackoverflow com questions 178256
  • 合并来自 ffmpeg 的两个视频

    我想使用 ffmpeg 将两个 mp4 视频组合成一个 mp4 视频 到目前为止我尝试过的是 ffmpeg i input1 mp4 i input2 mp4 output mp4 但是 每次我获取带有第一个输入的视频编解码器的视频而不是另
  • Android 上的 GStreamer

    谁能给我一些关于让 GStreamer 在 Android 上工作的提示 我以前从未使用过它 我想将它与 FFmpeg 一起使用 我已经编译了 FFmpeg 并且在 Android 上运行良好 我只是想使用 GStreamer 来帮助完成一
  • 使用 ffmpeg 将 h.264 avi 容器转换为 mp4

    我想使用 ffmpeg 将 h 264 avi 容器转换为 mp4 容器 我发现这个有效 ffmpeg i myfile avi vcodec copy myfile mp4 ffmpeg version N 51169 gcedf276
  • 将 H264 视频转换为原始 YUV 格式

    是否可以使用 ffmpeg 从 H264 编码视频创建原始 YUV 视频 我想用 matlab 打开视频并逐帧访问 Luma Cb 和 Cr 分量 是的 您可以 您只需指定像素格式即可 要获取格式的完整列表 ffmpeg pix fmts
  • Google Cloud Platform:将上传的 MP4 文件转换为 HLS 文件

    我正在构建一个平台 允许用户将一些视频文件 20 40 秒 从手机上传到服务器 所有这些上传目前都运行良好 文件通过nodejs云功能存储在谷歌存储桶中 现在我想创建一个 gcp 转码器作业 它将上传的 mp4 视频文件转换为 hls 视频
  • 使用 libx264 为 Raspberry pi 编译 Xuggler 时的问题 #2

    我正在尝试编译Xuggler http www xuggle com xuggler 对于 Raspberry Pi 在 Debian 操作系统上运行 又名 Raspbian 我遵循了可用的 基本构建说明 here http www xug
  • 访问 AVFrame 的每个像素

    我需要访问 FFMPEG 的 AVFrame 对象的每个像素信息 如果是 RGB 则每个像素的每种颜色 R G 和 B 我怎样才能做到这一点 如果您已经前进到正确的框架 类似于 img convert ctx ffmpeg sws getC
  • WPF 无法从 url 检索 WebP 图像?

    我无法从网址检索图像 以前 在设置 HttpClient 标头之前 我根本无法连接到该站点 我可以从其他来源检索图像 但不能从这个特定来源检索图像 检索图像的代码 var img new BitmapImage img BeginInit
  • 重新采样 H264 视频以降低帧速率,同时保持高图像质量

    以下是感兴趣的视频的 mplayer 输出 br carina tmp mplayer foo mov mplayer Symbol ff codec bmp tags has different size in shared object
  • 使用 Ffmpeg 编辑视频元数据

    我想更改视频元数据 原始视频信息 ffmpeg i video mp4 Metadata major brand mp42 minor version 0 compatible brands isomavc1mp42 creation ti

随机推荐

  • 百川AI大模型开放内测,你的AI工具箱里又多了一个选择

    日前国内大模型开源市场又多了一个猛将 百川智能 厂商卷 消费者就受益 这块模型由原搜狗创始人带队研发 背后融合有一些搜索的思路 日前公开了其53B的大模型 未来的企业应用上又多了一份选择 https www baichuan ai com
  • Java常用实用类总结

    常用实用类总结 这应该算是我写的第一篇比较正式的文章了 主要介绍一下我门经常用到的一些常用实用类 主要包括 String类 StringBuffer类 StringTokenizer类 Date类 Calender类 Math类 BigIn
  • Qt—事件处理

    Qt中 事件作为一个对象 继承自QEvent类 常见的有键盘事件QKeyEvent 鼠标事件QMouseEvent和定时器事件QTimerEvent等 Qt中 任何QObject子类示例都可以接收和处理事件 实际编程中通常实现部件的pain
  • Rancher 全球化部署最佳实践

    作者 万绍远 CNCF 基金会官方认证 Kubernetes CKA CKS 工程师 云原生解决方案架构师 对 ceph Openstack Kubernetes prometheus 技术和其他云原生相关技术有较深入的研究 参与设计并实施
  • JS敏感信息泄露:不容忽视的WEB漏洞

    0x00 前言 这段时间jsonp漏洞再一次证明了一个微小的漏洞 经过攻击者的巧妙而持久的利用 也会对企业和用户造成巨大的危害 而本文将要介绍的JS泄露敏感信息问题也是如此 攻击者不仅可以轻松收集用户手机号 姓名等隐私信息 更可以借此攻入企
  • StreamUtils

    StreamUtils org springframework util StreamUtils 输入 从字节数组到输出流 void copy byte in OutputStream out 从输入流到输出流 int copy Input
  • 刷脸支付不带手机钱包一样可以买单

    今年 移动支付加快脚步 迅速腾飞 其中最受国内外各大企业商户重视的 应该属去年开始投入使用的刷脸支付设备了与扫描二维码等很多移动收款方法 刷脸 支付的应用更为方便 支付的效率更高 安全性更强 无疑速决了很多当前的短处 手机扫码签约免密支付
  • Eclipse打开时出现failed to create the java virtual machine...

    一 问题分析 关于Eclipse出现failed to create the java virtual machine 等情况 1 重装系统之后会发现eclipse很意外的打不开 2 有时候Eclipse使用的时间过长 3 以上情况都会出现
  • vue-router设置默认路由

    git仓库 https github com xiaoli0510 vue router vue使用vue router步骤 1 安装并创建实例 npm install vue router 2 新建router 文件夹和router js
  • libvirt介绍

    libvirt是为了更方便地管理各种Hypervisor而设计的一套虚拟化库 libvirt作为中间适配层 让底层Hypervisor对上层用户空间的管理工具 virsh virt manager 做到完全透明 因为libvirt屏蔽了底层
  • 云原生Java架构师的第一课阿里云部署docker2- (docker实战-安装mysql)

    docker安装成功 后面就只需要去找对应的网站进行镜像下载安装就可以安装任意版本的数据库 而不需要考虑Linux服务器版本和架构 1 拉取 MySQL 镜像 去docker hub 找到mysql镜像 上面有所有的mysql版本和拉取镜像
  • 【网安神器篇】——hydra爆破工具

    作者名 Demo不是emo 主页面链接 主页传送门创作初心 舞台再大 你不上台 永远是观众 没人会关心你努不努力 摔的痛不痛 他们只会看你最后站在什么位置 然后羡慕或鄙夷座右铭 不要让时代的悲哀成为你的悲哀专研方向 网络安全 数据结构 每日
  • 用photoshop拼接一个七巧板图案

    转自 https jingyan baidu com article 215817f7a1f6fb1eda1423f8 html 图片处理软件图片市场是一个常见的工具软件 我们在使用时可以自己发掘一些有意思的功能 笔者从旋转拼接角度 以一个
  • 8-3编码器,3-8译码器的verilog实现

    在数字系统中 由于采用二进制运算处理数据 因此通常将信息变成若干位二进制代码 在逻辑电路中 信号都是以高 低电平的形式输出 编码器 实现编码的数字电路 把输入的每个高低电平信号编成一组对应的二进制代码 设计一个输入为8个高电平有效信号 输出
  • 回到十七世纪,让我来编算一本常用对数表(对数结果是小数,要有分数的思想,指数的幂是分数,这样可以实现小数分数转化位整数的幂的求法)

    原文地址 回到十七世纪 让我来编算一本常用对数表作者 小牛 自十八 九岁学习了对数后 就觉得造对数表真不简单 据说十七世纪那时 说如果谁发现了对数表上有一个数字错 就奖一两黄金 据百科百度 纳皮尔 1550 1617年 苏格兰数学家 对数的
  • GBK/GBK2312字库寻址及使用原理

    一 字符编码 1 1 ASCII编码 我们知道 我们所见到的所有字符编码 对于计算机来说都是0 1 更具不同位上的0 1 一个字节 8位 共有256中排列方式 因此一个字节就可以表示256个不同的字符 在这个前提下 ASCII编码就由美国制
  • 因材施教,有道发布“子曰”教育大模型,落地虚拟人口语教练等六大应用

    因材施教的教育宗旨下 大模型浪潮中 网易有道凭借其对教育场景的深入理解和对商业化的理性思考 为行业树立了垂直大模型的典范 7月26日 教育科技公司网易有道举办了 powered by 子曰 教育大模型应用成果发布会 会上重磅推出了国内首个教
  • 游戏与创新

    一 严肃游戏的概念 严肃游戏的出现 最早可以追溯到公元前1400年 当时在古埃及 有一款名为播棋的棋类游戏 这种游戏以植物种子或石子作为道具 在地面或棋盘上 目的是把对方的棋子吃掉 同时 播棋也在日常交易中 被用作计算数量的商业辅助工具 严
  • 5G 速率介绍

    本文就对如何计算最大速率不做介绍 主要介绍的是NSA和SA速率的差别 以及上下行速率的差异 由于5G单用户下行可以到4流 上行可以到2流 而且上下行都支持256QAM 2 6G频率 5ms单周期 配置下 NSA和SA终端下行峰值速率约1 6
  • 用FFmpeg制作WebP动图

    去年写过一篇文章 是教大家用FFmpeg制作GIF动画的 今天在讨论到项目中碰到的一个 apng动画素材引起的程序崩溃时 有位同学建议 我们为啥不用WebP来代替 apng 是啊 why not 网上搜到一篇文章 自己试了一下 发现强大的F