Как получить кадр из видеофайла в android

MediaMetadataRetriever.getFrameAtTime() всегда возвращает одинаковые фреймы при вызове. Посмотрите мой код

private ArrayList<Bitmap> getFrames(String path){
    try {
        ArrayList<Bitmap> bArray = new ArrayList<Bitmap>();
        bArray.clear();
        MediaMetadataRetriever mRetriever = new MediaMetadataRetriever();
        mRetriever.setDataSource(getDataSource(path));

        for (int i = 3000; i <60000; i=i+5000) {
            bArray.add(mRetriever.getFrameAtTime(i, MediaMetadataRetriever.OPTION_CLOSEST_SYNC));

        }

        return bArray;
    } catch (Exception e) {
        // TODO: handle exception

        return null;

    }
}

Этот метод всегда возвращает те же фреймы

Ответ 1

Вам понадобится использовать что-то вроде FFMPEG для извлечения кадров.

Вам нужно будет использовать NDK и скомпилировать FFMPEG для Android; к сожалению, это не будет очень легко.

Несколько исходных точек:

http://ffmpeg.org/

ffmpeg для андроида (с использованием учебника: "ffmpeg и Android.mk" )

Удачи!

Ответ 2

Я не знаю, как долго ваше видео, но время для использования в длинном var, поскольку время getTimeAtFrame должно быть выражено в MICRO секунды

ex: видео с 1 секундой имеет 1000000 USeconds, если вы используете очень короткий период (например, вы), вам очень повезло бы получить первый кадр только для вашего видео!

Ответ 3

Леон Пеллетье прав. Проблема в том, что MediaMetadataRetriever.getFrameAtTime() может извлекать только ключевые кадры из видео на втором уровне. Например, если видео имеет около 4 секунд, вы можете получить только 4  или 5 различных кадров. Чтобы получить все видеокадры, обратитесь к MediaCodec.