美文网首页Android开发Android知识
Android - 视频提取图片方法

Android - 视频提取图片方法

作者: fish_leong | 来源:发表于2017-06-07 16:01 被阅读174次

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


相关文章

网友评论

    本文标题:Android - 视频提取图片方法

    本文链接:https://www.haomeiwen.com/subject/iizofxtx.html