Я пытаюсь извлечь все кадры из видео.
Следующим кодом я хочу получить первые 30 кадров видео, но я получил только первый кадр 30 раз.Извлечь растровое изображение из видео в android
private ArrayList<Bitmap> getFrames(String path) {
try {
ArrayList<Bitmap> bArray = new ArrayList<Bitmap>();
bArray.clear();
MediaMetadataRetriever mRetriever = new MediaMetadataRetriever();
mRetriever.setDataSource("/sdcard/myvideo.mp4");
for (int i = 0; i < 30; i++) {
bArray.add(mRetriever.getFrameAtTime(1000*i,
MediaMetadataRetriever.OPTION_CLOSEST_SYNC));
}
return bArray;
} catch (Exception e) { return null; }
}
Теперь, как я могу получить все кадры из видео?
Время, указанное 'getFrameAtTime', находится в микросекундах, поэтому для видео с частотой 30 кадров в секунду между кадрами будет около 33333 микросекунды. Последний кадр, который ваш код пытается прочитать, составляет 30000 микросекунд - т. Е. Вы даже не переместились ко второму кадру (в зависимости от частоты кадров, конечно). Другое дело, что 'OPTION_CLOSEST_SYNC' извлекает _keyframe_ ближе всего к указанному вами времени. Как правило, меньше кадровых кадров, чем общие кадры в сжатом видео. – Michael
Привет @ Майкл, мое видео с 30 кадрами в секунду. и теперь я использую следующий код для вытяжных растровых изображений .... для (INT I = 0; я <10; я ++) { \t \t \t \t bArray.add (mRetriever.getFrameAtTime (33333 * я, \t \t \t \t \t \t MediaMetadataRetriever.OPTION_CLOSEST_SYNC)); \t } но ничего не изменится .. здесь я получил только первый кадр в растровом файле. –
Как я писал в своем первом комментарии, вы извлекаете ключевой кадр, ближайший к данному времени, когда вы используете 'OPTION_CLOSEST_SYNC'. Маловероятно, что видео содержит 10 или более кадров для каждого ключевого кадра. Используйте 'OPTION_CLOSEST', если вы хотите получить какой-то фрейм, а не только ключевые кадры. – Michael