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();              }          });      }


更多相关文章

  1. android监听视频播放结束
  2. Android开发Android(安卓)studio之gradle打包apk重命名的方法
  3. Android端获取视频第一帧的方法
  4. Android手机开发:日期函数之判断某日期格式是否之前+计算某日期之
  5. 【Android】 字体适配——不跟随系统字体大小、动态设置字体大小
  6. android 获取视频,图片缩略图
  7. android 添加视频、图片、录音上传(一)
  8. 短视频平台搭建Android(安卓)Camera 录制视频,可限制时长,限大小
  9. android中解析lrc歌词

随机推荐

  1. Android(安卓)safe mode
  2. android屏幕常亮
  3. Android(安卓)简单的统计图
  4. 选项菜单、子菜单、上下文菜单的使用
  5. Android(安卓)Drawable
  6. Android(安卓)Studio 导入问题总结-IT蓝
  7. android sdcard 相关操作
  8. android 利用TrafficStats类获取本应用的
  9. Android(安卓)Studio生成javadoc
  10. Android必会小功能总结