2

我正在开发一个应用程序,它获取本地视频文件并提取其帧并写入磁盘。我ffmpegmediametadataretriever用来从视频中提取帧。我已经完成了以下代码

   retriever.setDataSource(activity, uri);
   Log.e("duration -> ", retriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION));
   long duration = Long.parseLong(retriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION));
   int everyNFrame = 1;
   double frameRate = Double.parseDouble(retriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_FRAMERATE));
   Log.e("all metadata", retriever.getMetadata().getAll().toString());
   long sec = Math.round(1000 * 1000 / (frameRate));
   Bitmap bitmap;
// Bitmap bitmap2;
// Log.e(" timeskip ", sec + "   -----------   " + (frameRate * 1000));
   for (long i = 1000; i < duration * 1000; i += sec)
// for (long i = sec; i < duration * 1000 && !stopWorking; i += sec)//30*sec)
// for(int i=1000000;i<duration*1000 && !stopWorking;i+=300000)
   {
       bitmap = retriever.getFrameAtTime(i, FFmpegMediaMetadataRetriever.OPTION_CLOSEST_SYNC);
       if (bitmap != null) {
          try {
                  FileOutputStream out = new FileOutputStream(path + "/img_" + (i) + ".jpg");
                  Log.e("filename->", path + "/img_" + i + ".jpg");
                  bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
                  bitmap.recycle();
                  Thread.sleep(75);
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
       }
    }

它没有从视频中提取所有帧。对于某些视频,重复提取的帧。为不同的视频提取随机数量的帧。对于某些视频,提取了 70-80% 的帧,而对于某些仅提取了 15-20 帧。

我已经浏览了在 StackOverflow 和其他网站上可以找到的所有答案以找到解决方案,但问题就在那里。

4

0 回答 0