Java 实现分段截取视频 生成gif图 使用ffmpeg操作
前言
因为公司需求,需要把一段视频转换成gif图,具体需求是这样的,需要把一段视频按照他视频的长度,(0%,20%,40%,60%,80%,90%)每段截个3秒,然后组合成一个gif,面向谷歌编程没找到轮子,只能自己写了,途中代码也借鉴了一些别人的。希望看到的作者联系一下,给你标注一下。
话不多说上代码
核心代码
这里是抽出来的核心代码
public static boolean spitVideo(String paletteFile,String timeStart,String filepath,String videoPath,String flag) throws IOException, InterruptedException {
String s="";
if(flag.equals("0")){
//竖
s="212*272";
}else {
//横
s="320*180";
}
//设置进程生成器的操作系统程序,方便理解一点,大体意思就是操作cmd然后执行命令
Process p = new ProcessBuilder()
.command(FFMPEG_PATH,
"-v", "warning",
//-ss 从第几秒开始
"-ss", timeStart,
//-t 共要多少时间
"-t", "3",
//-i 输入文件
"-i", videoPath,
//-r 表示一秒几帧
"-r", "15",
"-s", s,
//-vf 执行缩放 scale 视频宽度 -1表示保持长宽比
"-q:v", "2",
//-y 文件存在时直接覆盖不再询问
"-y", filepath+"/"+paletteFile+"%03d.png", "-vn")
.redirectError(new File("stderr.txt"))
.start();
logger.info("errorFilepath:"+filepath+"/"+paletteFile+"d.png");
boolean isComplete = p.waitFor(10, TimeUnit.SECONDS);
if(!isComplete){
logger.info("生成调色板出错");
throw new InterruptedException("生成调色板出错");
}
return isComplete;
}
调用的抽象方法,包含逻辑处理
算是通过一种取巧的方式,来实现,
因为ffmpeg 不能直接实现 所以取巧了一下
生成不同的文件夹A,B,C,D,E,F, 每个文件夹下面截取部分的视频帧
全部截取完之后 再把这些文件夹里的图片合成一个gif
算是实现了需求,如果有更好的方式,请各位大佬在评论区里指点一二
不同的时间点截取视频帧,面向谷歌 没有找到解决方案。
/**
*
* @user: su桑
* @param time 视频时长。
* @param directoryPath 生成文件的文件路径
* @param videoPath 需要转换的视频路径 绝对路径全地址
* @param flag 这个需求会用到的 生成横板gif 或者是竖版 不需要的可以去掉 0为竖版 1为横板
* @throws IOException
* @throws InterruptedException
*/
public static void getGif(int time,String directoryPath,String videoPath,String flag) throws IOException, InterruptedException {
//生成文件夹
File file=new File(directoryPath);
if (!file.isDirectory()){
file.setWritable(true,