Как получить кадр из видеофайла в 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.