Bootstrap

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,
;