Android MediaMetadataRetriever getFrameAtTime仅返回第一帧
下面的代码仅返回(test.gif)第一帧,并使用5个相同帧(视频第一帧)生成gif 我阅读了StackOverflow中的大多数问题,但我不知道是什么导致了这个问题 另外,根据一些建议,我尝试将Android MediaMetadataRetriever getFrameAtTime仅返回第一帧,android,video,animated-gif,mediametadataretriever,Android,Video,Animated Gif,Mediametadataretriever,下面的代码仅返回(test.gif)第一帧,并使用5个相同帧(视频第一帧)生成gif 我阅读了StackOverflow中的大多数问题,但我不知道是什么导致了这个问题 另外,根据一些建议,我尝试将mmRetriever.getFrameAtTime与mediamataretriever.OPTION\u最近的选项一起使用,但没有成功 @Override public void onActivityResult(int requestCode, int resultCode, Intent
mmRetriever.getFrameAtTime
与mediamataretriever.OPTION\u最近的
选项一起使用,但没有成功
@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();
}
}
}
@覆盖
ActivityResult上的公共void(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
if(resultCode==RESULT\u OK){
Uri vid=data.getData();
videoPath=getPath(vid);
MediaMetadataRetriever mmRetriever=新的MediaMetadataRetriever();
mmRetriever.setDataSource(videoPath);
字符串元数据\u键\u持续时间=mmRetriever
.extractMetadata(MediaMetadataRetriever.METADATA\u KEY\u DURATION);
ByteArrayOutputStream bos=新建ByteArrayOutputStream();
AnimatedGifEncoder编码器=新的AnimatedGifEncoder();
编码器。设置延迟(30);
编码器启动(bos);
int max=(int)Long.parseLong(元数据\u键\u持续时间);
Log.i(“max”,String.valueOf(max));
对于(int i=1000000;i来源:
的getFrameAt方法以微秒(1/1000000秒)为单位,而不是毫秒,因此在您的情况下,它总是向下舍入到第一帧。i使用:for更新代码(int i=1000000;iWilliam,这是什么意思,我使用log,i等于1000000000000,…在每一步中,它是否正确?第一帧返回问题,与最初给出的问题相同。我不明白为什么这个问题给出否定?问题在哪里?我有问题,并尽可能给出详细信息,必须看到