【问题标题】:how to get frame rate of video in android os?如何在android os中获取视频的帧速率?
【发布时间】:2017-02-13 13:13:12
【问题描述】:

我想获得视频的帧率,但我不想使用 FFMPEG、JAVACV 库。 可以在android中获得视频的帧率吗?

我读到KEY_FRAME_RATE 说,“具体来说,MediaExtractor 提供了一个与轨道的帧速率信息相对应的整数值(如果指定且非零)。” 但是不知道怎么用?

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

【问题讨论】:

    标签: java android video frame-rate


    【解决方案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 如果 KEY_FRAME_RATE 不存在,则代码检查是否为 NPE。见上文

    【讨论】:

    • 它在 format.getString(MediaFormat.KEY_MIME) 处抛出 NullPointerException
    • 发布同样的日志。但是如果它进入 for 循环会怎样呢?
    • java.lang.NullPointerException:尝试在空对象引用 02-16 19:19:21.741 上调用虚拟方法“int java.lang.Integer.intValue()”:E/fra(7900 ): 在 android.media.MediaFormat.getInteger(MediaFormat.java:591) 02-16 19:19:21.741: E/fra(7900): 在 com.exam.activity.VideoPlayActivity.init(VideoPlayActivity.java:101) 02-16 19:19:21.741: E/fra(7900): at com.exam.activity.VideoPlayActivity.onCreate(VideoPlayActivity.java:59)
    • 您正在测试的 android OS 版本是什么?还可以尝试发布 format.containsKey(MediaFormat.KEY_FRAME_RATE) 的值。您可以在 String mime 之前记录此内容。例外是在这个 format.getInteger 行。
    • android 6.0,内核版本3.10.72+
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多