我一直在尝试找出如何在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[]
,然后通过Glide
将byte[]
提交到GifImageView
,但我猜视频的byte[]
与gif文件的不同(如果我错了,请告诉我)。
encoder.addFrame(mmr.getFrameAtTime(timeAt));
将位图添加到编码器 @AdeelTurk - Joel Robinson-JohnsondoInBackground
方法返回的字符串被用作onPostExecute
中调用的方法的参数。该方法创建了一个意图,用于启动自动播放 gif 的新活动。我知道播放 gif 的视图是有效的,因为您也可以直接提交 gif 文件(我已经这样做了)。但是,我看到的是一张静态图片,而不是 gif。 - Joel Robinson-Johnson