Android 用ffmpeg生成Gif 各种排列组合的性能测试结果

Gif 测试

bmps -> Animated gif encode   -> 质量不错,  慢死,   10帧大概要两分钟

bmps 》 png  》avi 》gif    保存 png 速度太慢,  两秒钟一张,最后一步图片失真

bmps 》jpg 》 avi 》 gif  保存图片速度明显好于png,  最后一步图片失真

bmps 》 jpg 》gif   可以用ffmpeg里面的参数来保证gif图片元素在位移不太大的情况下 不那么失真, 不过效果有限


用到的ffmpeg的命令:

    public String water_mark(String input1, String input2) {
        String output = getTmpPath("")+"output.mp4";

        String merge = "ffmpeg -i "+input1+" -y -strict -2 -vf movie="+input2+"[watermark];[in][watermark]overlay=0:0[out] "+output;

        runParams(merge.split(" "));
        return output;

    }

    public String mp42gif(String input1,String input2){
        String[] params = new String[8];
        params[0] = "ffmpeg";
        params[1] = "-i";
        params[2] = input1;
        params[3] = "-t";
        params[4] = "5";
        params[5] = "-pix_fmt";
        params[6] = "rgb24";


        String DCIM = Environment.getExternalStorageDirectory() + File.separator + Environment.DIRECTORY_DCIM + File.separator;
        params[7] = input2;

        runParams(params);

        return null;
    }

    public String video_merge_gif(String input1, String input2){
        String[] params = new String[4];
        params[0] = "ffmpeg";
        params[1] = "-i";
        params[2] = input1;
        String DCIM = Environment.getExternalStorageDirectory() + File.separator + Environment.DIRECTORY_DCIM + File.separator;
        params[3] = DCIM+"image%d.jpg";

        runParams(params);

        return null;
    }

    public String gif2mp4(String input1, String input2){
        String[] params = new String[4];
        params[0] = "ffmpeg";
        params[1] = "-i";
        params[2] = input1;
        params[3] = input2;

        runParams(params);

        return null;
    }


    public String video_merge_test(String input1, String input2,ArrayList<ScaleAndRotateGifView> viewArrayList,String output){

//        String test = "ffmpeg -y -i "+input1+" -i "+input2;
        int k=0;
        for(ScaleAndRotateGifView view:viewArrayList){
            Utility.copyFile(view.getImagePath(), getTmpPath(k + "") + ".gif");
//            test+=" -ignore_loop 0 -i "+getTmpPath(k+"")+".gif";
            k++;
        }
//        test+=" -strict -2 -filter_complex [0:0]pad=iw:ih[a];[a][1:0]overlay=0";
//        char temp = 'b';
//        int i = 2;
//        for(ScaleAndRotateGifView view:viewArrayList){
//            test+="["+temp+"];["+temp+"]["+i+":0]overlay=0:h";
//            temp++;
//            i++;
//        }
//        test+=" -shortest "+output;

        String test="ffmpeg -y -i "+input1+" -i "+input2+" -ignore_loop 0 -i "+getTmpPath("0.gif")+" -ignore_loop 0 -i "+getTmpPath("1.gif")+" -strict -2 -filter_complex [0:0]pad=iw:ih[a];[a][1:0]overlay=0[b];[b][2:0]overlay=0:h[c];[c][3:0]overlay=w:h -shortest "+output;
        String[] params = test.split(" ");

        runParams(params);

        return null;
    }


    public String splitGif(String input1,String input2){
        String[] params = new String[6];
        params[0] = "ffmpeg";
        params[1] = "-i";
        params[2] = input1;
        params[3] = "-r";
        params[4] = "10";
        params[5] = input2;

        App.getCurrentApp().runParams(params);

        return null;
    }
    public String preparePalettegen(){
        String input1 = DCIM + "testgif" + (it + 1) + ".jpg";
        String tempPNG = App.getCurrentApp().getTmpPath("palettegen.png");

        String param = "ffmpeg -y -i " + input1 +
                " -vf palettegen -y " + tempPNG;
        App.getCurrentApp().runParams(param.split(" "));
        return tempPNG;
    }

    public String img2gif(String input1,String input2){
        String tempPNG = preparePalettegen();

        String command = "ffmpeg -f image2 -framerate 5 -i "+input1+" -i "+tempPNG+" -filter_complex fps=10,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse "+input2;
        String[] params = command.split(" ");

        App.getCurrentApp().runParams(params);

        return null;
    }


 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值