2021-03-01 :GIF截帧方案选型

方案设计

  1. 获取帧数小于 GIF能截取的总帧数 ?
  2. 进行实验,产出性能报告:
    1. 打开jvm监控,程序进行GIF截桢
      1. 控制变量
        1. 截桢线程数 (多少线程并发运行)?
        2. 截桢图片来源(运营提供)?
        3. 截桢程序 CPU 占用 (统计时间:运行前 ~运行中,CPU变化)?
        4. 截桢程序 内存 占用 (统计时间:运行前 ~运行中,内存变化)?
        5. 截桢程序 截取GIF图片耗时?

Java版本-1.8.0_02

Java(TM)SE运行时环境(内部版本1.8.0_02-b13)
Java HotSpot(TM)64位服务器VM(内部版本23.0-b10,混合模式)

JVM分配 2C / 2G

2线程并发情况

内存变化        

                      

CPU使用情况

GIF截桢耗时

(>=5桢耗时均值)

是否丢桢

GIF

java原生

50M

40%

20~30ms

原生JAVA截GIF 会出现部分桢无法获取,造成丢桢

Im4Java

需要安装ImageMagick,太重

open-imaging

 500MB

 50%

70~90ms

内存消耗大是因为内部进行了多次IO,进行桢位置重置,保证所有桢都能正常读取

Ffmpeg

(本身程序CPU&内存不大,ffmpeg方案视频同学也是在使用的,内存与CPU使用都偏高,没法在低配机器上执行)

java原生

2线程

     

Open-imaging:

2线程

原生JAVA截GIF 问题: java.lang.ArrayIndexOutOfBoundsException: 4096

java - ArrayIndexOutOfBoundsException: 4096 while reading gif file - Stack Overflow

编写了一个GIF图像解码器,并根据GitHub上的Apache License 2.0发布了它。您可以在这里下载:https : //github.com/DhyanB/Open-Imaging。用法示例:

void example(final byte[] data) throws Exception {
    final GifImage gif = GifDecoder .read(data);
    final int width = gif.getWidth();
    final int height = gif.getHeight();
    final int background = gif.getBackgroundColor();
    final int frameCount = gif.getFrameCount();
    for (int i = 0; i < frameCount; i++) {
        final BufferedImage img = gif.getFrame(i);
        final int delay = gif.getDelay(i);
        ImageIO.write(img, "png", new File(OUTPATH + "frame_" + i + ".png"));
    }
}

Im4Java 需要安装ImageMagick

Java图片处理 - 安装ImageMagick库使用convert命令_大大的微笑的博客-CSDN博客_imagemagick convert 安装

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值