如何在Android操作系统中获取视频的帧速率?

2022-09-02 03:53:35

我想获得视频的帧速率,但我不想使用FFMPEG,JAVACV lib。有可能在Android中获得视频的帧速率吗?

我读到KEY_FRAME_RATE它说,“具体来说,MediaExtractor提供了一个整数值,对应于轨道的帧速率信息,如果指定和非零”,但我不知道如何使用它?

如果您知道如何从视频中获取帧速率,请在此处回答。


答案 1
MediaExtractor extractor = new MediaExtractor();
int frameRate = 24; //may be default
try {
  //Adjust data source as per the requirement if file, URI, etc.
  extractor.setDataSource(...);
  int numTracks = extractor.getTrackCount();
  for (int i = 0; i < numTracks; ++i) {
    MediaFormat format = extractor.getTrackFormat(i);
    String mime = format.getString(MediaFormat.KEY_MIME);
    if (mime.startsWith("video/")) {
    if (format.containsKey(MediaFormat.KEY_FRAME_RATE)) {
        frameRate = format.getInteger(MediaFormat.KEY_FRAME_RATE);
      }
    }
  }
} catch (IOException e) {
  e.printStackTrace();
}finally {
  //Release stuff
  extractor.release();
}

注意:尝试在工作线程中运行上述代码。

更新 1什么是KEY_FRAME_RATE,也可能是可选的

KEY_FRAME_RATE在 API 级别 16 中添加 字符串KEY_FRAME_RATE 描述视频格式的帧速率(以帧/秒为单位)的键。当平台使用该值时,关联的值通常是整数,但视频编解码器也接受浮点配置值。具体而言,MediaExtractor 提供一个整数值,该值对应于轨道的帧速率信息(如果指定且不为零)。否则,此项不存在。MediaCodec 同时接受浮点值和整数值。这表示如果KEY_OPERATING_RATE不存在并且KEY_PRIORITY为 0(实时)时所需的工作帧速率。对于视频编码器,此值对应于预期的帧速率,尽管编码器应基于缓冲时间戳支持可变帧速率。MediaCodec 输入/输出格式中不使用此键,MediaMuxer 也不使用此键。

常量值:“帧速率”

更新 2如果 NPE 不存在,则代码检查 NPE KEY_FRAME_RATE。见上文


答案 2

推荐