android 视频图片,Android - 视频提取图片方法

下面看使用方法 MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();

mediaMetadataRetriever.setDataSource(filePath);

final String duration = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);//Unit ms 获取到视频的时长,单位毫秒

final String mime = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE);//mime 视频类型 video/mp4 等...

publishProgress(new Runnable() {

@Override

public void run() {

tv_file_duration.setText((duration + " ms"));

tv_file_mime.setText(mime);

}

});

final int seconds = Integer.valueOf(duration) / 1000;// getFrameAtTime by custom second 这里按秒为单位提取

publishProgress(new Runnable() {

@Override

public void run() {

progressBar.setMax(seconds - 1);

}

});

File directory = new File(outputPath);

if (!directory.mkdirs()) {

publishProgress(new Runnable() {

@Override

public void run() {

Toast.makeText(MainActivity.this, "can not create folder:" + outputPath, Toast.LENGTH_LONG).show();

}

});

} else {

ProgressRunnable progressRunnable = new ProgressRunnable();

//开始提取

for (int i = 0; i < seconds; i++) {

progressRunnable.run(i);

//注意,第一个参数单位是微秒

//第二个参数

//OPTION_PREVIOUS_SYNC 检索出的同步帧(可能)在该时间戳之前,也可能就是该时间戳的同步帧

//OPTION_NEXT_SYNC 检索出的同步帧可能(可能)在该时间戳之后,也可能就是该时间戳的同步帧

//OPTION_CLOSEST_SYNC 检索最接近该时间戳的同步帧

//OPTION_CLOSEST 检索出的同步帧可能是最接近该时间戳的帧,也肯就是该时间戳的帧,如果在该时间戳段上没有找到同步帧,则会与其他OPTION相比,但这样会性能开销会很大(这里不太明白)

Bitmap bitmap = mediaMetadataRetriever.getFrameAtTime(i * 1000 * 1000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);

String newPath = outputPath + i + extensionName;

File file = new File(newPath);

file.deleteOnExit();

try {

if (file.createNewFile()) {

//保存到文件

FileOutputStream fileOutputStream = new FileOutputStream(file);

bitmap.compress(CompressFormatType, 100, fileOutputStream);

bitmap.recycle();

fileOutputStream.close();

}

} catch (Exception e) {

e.printStackTrace();

}

}

//update view

final File[] files = directory.listFiles(imageExtensionNameFilter);

publishProgress(new Runnable() {

@Override

public void run() {

//load images

gridView.setAdapter(new GridViewAdapter(files));

}

});

//finish

publishProgress(new Runnable() {

@Override

public void run() {

//finish tip

btn_choose.setEnabled(true);

Toast.makeText(MainActivity.this, "finish", Toast.LENGTH_LONG).show();

}

});

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值