Android 提取视频图片
-
android.media.MediaMetadataRetriever 提供了一个统一的接口用于从一个媒体文件中取得帧和元数据
-
API 10 之前没有开放,但能通过反射实现
-
完整Demo地址:Video2Image(https://github.com/fish-leong/Video2Image)
-
下面看使用方法
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(); } }); }
网友评论