将视频文件转换为gif

3
我一直在尝试找出如何在Android中将视频文件转换为gif的方法。我在网上找到了一个类,名为AnimatedGifEncoder类(https://github.com/nbadal/android-gif-encoder/blob/master/GifEncoder.java),但它似乎并不起作用。我将视频转换为gif的过程包装在一个AsnycTask中。以下是代码:
@Override
protected String doInBackground(File[] files) {
    MediaMetadataRetriever mmr = new MediaMetadataRetriever();
    try {
        mmr.setDataSource(files[0].getPath());
    } catch (Exception e){
        Log.i("VMPF", e.toString());
    }
    //int framesRate = Integer.parseInt(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_CAPTURE_FRAMERATE));
    int duration = Integer.parseInt(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION));
    Log.i("gifduration","" + duration);
    //Log.i("giffps","" + framesRate);
    int millisPerframe = 1000/24;
    int timeAt = 0;
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    AnimatedGifEncoder encoder = new AnimatedGifEncoder();
    encoder.setDelay(0);
    encoder.setRepeat(100);
    encoder.start(bos);
    while (timeAt < duration){
        encoder.addFrame(mmr.getFrameAtTime(timeAt));
        timeAt += millisPerframe;
        Log.i("wenfhluwhru", timeAt+"");
    }
    encoder.finish();
    Log.i("wenfhluwhru", "loop finished");
    FileOutputStream outStream = null;
    try {
        outStream = new FileOutputStream(path);
        outStream.write(bos.toByteArray());
        outStream.close();
        Log.i("wenfhluwhru", "outstream closed");
        return path;
    } catch(Exception e) {
        e.printStackTrace();
    }
    return null;
}

我的代码有问题吗(我假设AnimatedGifEncoder类没有问题)?此外,我考虑将文件转换为byte[],然后通过Glidebyte[]提交到GifImageView,但我猜视频的byte[]与gif文件的不同(如果我错了,请告诉我)。


实际上,您需要传递图像文件列表..我认为您正在传递视频文件。 - Adeel Turk
http://android-er.blogspot.com/2014/12/create-animated-gif-from-mp4.html - Adeel Turk
encoder.addFrame(mmr.getFrameAtTime(timeAt)); 将位图添加到编码器 @AdeelTurk - Joel Robinson-Johnson
抱歉,我的错。那么以上代码的结果是什么? - Adeel Turk
doInBackground 方法返回的字符串被用作 onPostExecute 中调用的方法的参数。该方法创建了一个意图,用于启动自动播放 gif 的新活动。我知道播放 gif 的视图是有效的,因为您也可以直接提交 gif 文件(我已经这样做了)。但是,我看到的是一张静态图片,而不是 gif。 - Joel Robinson-Johnson
显示剩余2条评论
2个回答

2
你可以在不同的时间找到帧并创建一个动画可绘制对象。
public void getGIF(){
    int counter = 0;
    Bitmap b = mmRetriever.getFrameAtTime(counter);
    while(counter < duration && b != null){
        frame = new BitmapDrawable(getResources(), b);
        animationDrawable.addFrame(frame, 50);
        counter += incrementor;
        b = mmRetriever.getFrameAtTime(counter);
    }
}

1

您可以像这样使用FFMPEG将视频文件转换为gif:

在您的应用程序的build.gradle中添加以下内容:

implementation 'nl.bravobit:android-ffmpeg:1.1.7'

那么

        var name="sample"
        var inFIle = Environment
                .getExternalStoragePublicDirectory(Environment
                        .DIRECTORY_DOWNLOADS).toString() + "/${name}.mp4"

        var gifFIle = Environment
                .getExternalStoragePublicDirectory(Environment
                        .DIRECTORY_DOWNLOADS).toString() + "/${name}gif.gif"
        val cmd = arrayOf("-i", inFile, gifFIle)

        val ffmpeg = FFmpeg.getInstance(baseContext)



        if (ffmpeg.getInstance(baseContext).isSupported){



         ffmpeg.execute(cmd, object : ExecuteBinaryResponseHandler() {
            override fun onStart() {

            }

            override fun onProgress(message: String) {


            }

            override fun onFailure(message: String) {

            }

            override fun onSuccess(message: String) {

            }

            override fun onFinish() {


            }
        })
}

嘿@Meysam Hadigheh,请提供给我完整的GIF生成器代码。 - SAndroidD
它不起作用。你能提供完整的代码吗? - SAndroidD
@SAndroidD 我修改了回答,你必须在执行之前初始化ffmpeg,通过检查它是否支持,它将被初始化。 - Meysam Hadigheh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接