MediaMetadataRetriever getFrameAtTime возвращает только первый кадр
Приведенный ниже код возвращает (test.gif) только первый кадр и создает рисунок с 5 одинаковыми кадрами (первый кадр видео).
Я читаю большинство вопросов в Stackru, но не могу понять, что является причиной этой проблемы.
Также, по некоторым предложениям, я пытался использовать mmRetriever.getFrameAtTime
с MediaMetadataRetriever.OPTION_CLOSEST
вариант без успеха.
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
Uri vid = data.getData();
videoPath = getPath(vid);
MediaMetadataRetriever mmRetriever = new MediaMetadataRetriever();
mmRetriever.setDataSource(videoPath);
String METADATA_KEY_DURATION = mmRetriever
.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
AnimatedGifEncoder encoder = new AnimatedGifEncoder();
encoder.setDelay(30);
encoder.start(bos);
int max = (int) Long.parseLong(METADATA_KEY_DURATION);
Log.i("max",String.valueOf(max));
for (int i=1000000;i<max*1000;i+=1000000) {
Log.i("i",String.valueOf(i));
Bitmap bitmap = mmRetriever.getFrameAtTime(i,MediaMetadataRetriever.OPTION_CLOSEST);
encoder.addFrame(bitmap);
}
encoder.finish();
try {
String filepath = Environment.getExternalStorageDirectory()
+ File.separator + "test.gif";
FileOutputStream outStream = new FileOutputStream(filepath);
outStream.write(bos.toByteArray());
outStream.close();
GifAnimationDrawable big = new GifAnimationDrawable(
new FileInputStream(filepath));
imageview.setImageDrawable(big);
big.setVisible(true, true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Максимальное значение возврата журнала около 5000
1 ответ
Из этого источника:
Метод getFrameAt в MediaMetadataRetriever занимает микросекунды (1/1000000 секунды) вместо миллисекунд, поэтому в вашем случае он всегда округляется до 1-го кадра.