2017-02-22 28 views
0

Итак, у меня есть приложение, в котором пользователи могут снимать видео, и я хочу захватить определенные кадры из файла. Когда я использую метод MediaMetaDataRetriever.getFrameAtTime(), он может извлекать только один кадр каждую секунду, но я хочу также захватить кадры между секундами. Я также пытался реализовать Jcodec в свой проект, чтобы захватить правильные кадры:Получить точный кадр из видео в Android

FrameGrab.getFrame(new File(videoFileToRetreive.getVideoFile()), currentFrame);,

Однако, независимо от того, какого числа я вкладываю в currentFrame, изображение всегда возвращает первый кадр видео. Есть ли способ выполнить что-то подобное без использования ffmpeg? Если кто-то знает ответ, он будет очень признателен.

ответ

0

Предположительно, если вы используете MediaMetaDataRetriever, вы также используете MediaPlayer из той же структуры.

Если это так, то MediaPlayer предоставляет метод seekTo(millis)

К сожалению seekTo перемещает дорожки в метку времени, а не рамы, но вы должны быть в состоянии выработать правильную позицию, чтобы двигаться к тому, если вам знать частоту кадров.

Также: при просмотре getFrameAtTime параметр, который он принимает, - это «uSecs», который я принимаю как микросекунды - это означает, что метод может возвращать гораздо больше одного кадра в секунду - проблема, которую вы видите, может быть связана с тем, нет кадра в том, что точной микросекунде, он принимает близлежащего кадр

Это означает, что если ваше видео имеет 30 кадров в секунду, будет кадр каждые 33.333 uSecs, поэтому убедитесь, что использовать интервалы вблизи такого размера при вызове getFrameAtTime

+0

Я пробовал это, но он только пропускает ключевые кадры, которые существуют каждую секунду. Нельзя ли игнорировать это? – hermt2

+0

Я не все это знакомый tbh, я просто немного посмотрел на исходный код, потому что проблема была интересной, извините –

+0

Это нормально, спасибо за помощь, хотя – hermt2