下面看使用方法 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();
}
});
}