2017-02-13 26 views
14

Я хочу получить частоту кадров видео, но я не хочу использовать FFMPEG, JAVACV lib. - это возможность получить частоту кадров видео в android?Как получить частоту кадров видео в android os?

Я читал KEY_FRAME_RATE. Он говорит, что «в частности, MediaExtractor предоставляет целочисленное значение, соответствующее информации о частоте кадров дорожки, если она задана и не равна нулю». но я не знаю, как его использовать?

Если вы знаете, как получить частоту кадров от видео, тогда ответьте здесь.

ответ

15
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 Ключ, описывающий частоту кадров видео формата в кадрах/сек. Связанное значение обычно является целым числом, когда значение используется платформой, но видеокодеки также принимают значения конфигурации float. В частности, MediaExtractor предоставляет целочисленное значение, соответствующее информации о частоте кадров дорожки, если указано, и не равно нулю. В противном случае этой клавиши нет. MediaCodec принимает значения как float, так и integer. Это представляет желаемую рабочую частоту кадров, если KEY_OPERATING_RATE отсутствует, а KEY_PRIORITY - 0 (в реальном времени). Для видеокодеров это значение соответствует предполагаемой частоте кадров, хотя ожидается, что кодеры будут поддерживать переменную частоту кадров на основе временной метки буфера. Этот ключ не используется в форматах ввода/вывода MediaCodec или MediaMuxer.

Константа Значение: "частота кадров"

Update 2 Проверка код, если для NPE, если KEY_FRAME_RATE нет. См. Выше

+0

он бросает 'NullPointerException' в формате.getString (MediaFormat.KEY_MIME); –

+0

Опубликуйте журнал для того же. Но как это может быть, если он идет внутри цикла? –

+0

java.lang.NullPointerException: попытка вызвать виртуальный метод 'int java.lang.Integer.intValue()' для ссылки на нулевой объект 02-16 19: 19: 21.741: E/fra (7900): \t на android. media.MediaFormat.getInteger (MediaFormat.java:591) 02-16 19: 19: 21.741: E/fra (7900): \t at com.exam.activity.VideoPlayActivity.init (VideoPlayActivity.java:101) 02- 16 19: 19: 21.741: E/fra (7900): \t at com.exam.activity.VideoPlayActivity.onCreate (VideoPlayActivity.java:59) –