如何获取Android中视频文件的关键帧(同步帧)时间戳列表?

Ily*_*nko 11 video android

是否有任何API可以为我提供Android中给定视频文件关键帧的时间戳列表?

SDw*_*rfs 10

对于一个优雅的解决方案,似乎你需要使用ffmpeg for android来实现这一目标.有人试过这样:如何从android中的视频文件中获取帧 ; 并建议使用ffmpeg.

我检查了参考手册,但是只能找到一种方法来使用MediaMetadataRetriever()获取关键帧本身(没有时间戳)相对于给定位置的时间,如下所述:http://developer.android.com/reference/android /media/MediaMetadataRetriever.html#extractMetadata%28int%29

如果您不想使用ffmpeg,可以尝试以下方法:

private ArrayList<int> getKeyFrameTimestamps(String filename) {
  ArrayList<int> timeStamps = new ArrayList<int>();

  try {
    MediaMetadataRetriever mRetriever = new MediaMetadataRetriever();
    mRetriever.setDataSource(getDataSource(filename));
    mRetriever.getFrameAtTime(i, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);

    Bitmap lastFame = mRetriever.getFrameAtTime(0, MediaMetadataRetriever.OPTION_NEXT_SYNC);
    result.add(0);

    for(int time=1; frame ; ++time) {
      Bitmap frame = mRetriever.getFrameAtTime(time, MediaMetadataRetriever.OPTION_PREVIOUS_SYNC);
      if (frame && !frame.sameAs(lastFrame)) {
        result.add(time);
        lastFrame = frame;
      }
    }
  } catch (Exception e) {  /* TODO: HANDLE THIS */ }

  return timeStamps;
}
Run Code Online (Sandbox Code Playgroud)

这当然不是很优雅,但可能没有麻烦安装ffmpeg ...它可能也很慢(我不知道).但也许这正是你所需要的.

PS:可以在这里找到适合您的问题的ffmpeg教程:http://dranger.com/ffmpeg/tutorial07.html


Ily*_*nko 5

我相信正确答案是http://code.google.com/p/mp4parser/

isoparser API可以读写MP4文件结构.它是处理所谓的盒子的低级工具,但它也像处理轨道和电影这样的结构.

不错的API和方法比ffmpeg庞然大物快得多