android - 将视频文件转换为 gif
问题描述
我一直在试图弄清楚如何在 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
课程没有问题)?我还考虑过将文件转换为 abyte[]
并将其提交byte[]
到GifImageView
viaGlide
但我愿意猜测视频的字节 [] 与 gif 文件的不同(如果我错了,请告诉我)?
解决方案
您可以在不同时间找到帧并从中创建可绘制的动画
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);
}
}
推荐阅读
- typescript - 打字稿条件类型
- javascript - 如何在反应路由器中使用 match.params
- python - (Python/VS 代码)无法安装 scipy
- reactjs - 通过按钮将表单从 onRead 更改为 Edit
- excel - 比较非长度的两列时出现 VLOOKUP 问题
- javascript - 我如何在反应中使用 fetch 提交表单数据和文件?
- r - 仅基于 R 中的一列删除重复行
- java - java - 如何按年龄顺序对java中的对象数组或数组列表(包含假设10个对象)进行排序
- javascript - 如何从日历获取输入并使用 JavaScript 和 HTML 打印日期
- javascript - JavaScript 错误:“竞赛”不是函数