Java程序将视频转化为动图
1、引入依赖
<!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform --> <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platform</artifactId> <version>1.5.2</version> </dependency> <!-- https://mvnrepository.com/artifact/com.madgag/animated-gif-lib --> <dependency> <groupId>com.madgag</groupId> <artifactId>animated-gif-lib</artifactId> <version>1.4</version> </dependency>
注意,这里引入的javacv依赖是全平台的,会比较重量级。如果只想在某一个或多个平台使用,只引入对应平台的模块即可,这里请参考官方说明:
地址: or
2、使用案例
这里是将某一个目录下的MP4文件生成同名的gif文件demo代码,仅供参考。
package javacv; import com.madgag.gif.fmsware.AnimatedGifEncoder; import org.bytedeco.javacv.FFmpegFrameGrabber; import org.bytedeco.javacv.Java2DFrameConverter; import java.io.File; import java.io.FileOutputStream; public class Test { public static void main(String[] args) { // 将指定目录的 MP4 文件生成同名的 gif 文件 File videoDir = new File("/Users/mozat-gz/Downloads"); for (File file : videoDir.listFiles()) { String videoPath = file.getPath(); if (videoPath.endsWith(".mp4")) { String gifPath = videoPath.substring(0, videoPath.lastIndexOf(".")) + ".gif"; try { video2Gif(videoPath, gifPath); } catch (Exception e) { System.out.println("文件 [" + videoPath + "] 处理异常!"); e.printStackTrace(); } } } } private static void video2Gif(String videoPath, String gifPath) throws Exception { try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(videoPath); FileOutputStream targetFile = new FileOutputStream(gifPath)) { grabber.start(); int frames = grabber.getLengthInFrames(); AnimatedGifEncoder encoder = new AnimatedGifEncoder(); encoder.setFrameRate(frames); encoder.start(targetFile); Java2DFrameConverter converter = new Java2DFrameConverter(); for (int i = 0 ; i < frames ; i += 8) {// 8帧合成1帧?(反正越大动图越小、越快) encoder.setDelay((int) grabber.getDelayedTime()); encoder.addFrame(converter.convert(grabber.grabImage())); grabber.setFrameNumber(i); } encoder.finish(); } } }
上一篇:
Python 安装包管理工具 pip