Видео MP4 Последний кадр

Я пытаюсь получить последний кадр видео mp4 с помощью MediaMetadataRetriever, но он всегда возвращает первый кадр для коротких видео (например, 3-секундных длинных видео), он отлично работает для длинных видео. FFmpegMediaMetadataRetriever также дает тот же результат.

      MediaMetadataRetriever retriever = new MediaMetadataRetriever();
      retriever.setDataSource(video);
      String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
      Bitmap frameAtTime = retriever.getFrameAtTime(Long.parseLong(time)*1000, MediaMetadataRetriever.OPTION_CLOSEST);
      mImage.setImageBitmap(frameAtTime);

Мы ценим любые предложения.


person Salah Hammouda    schedule 29.04.2019    source источник
comment
Судя по описанию функции getFrameAtTime, она вернет 0, если ограничения не могут быть удовлетворены. Можете ли вы попробовать использовать int frame = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_FRAME_COUNT) для получения финального кадра видео, а затем использовать retriever.getFrameAtIndex(frame-1) для получения кадра? Также всегда следует проверять, что extractMetadata не возвращает значение null.   -  person charliebeckwith    schedule 29.04.2019
comment
getFrameAtIndex : для вызова требуется уровень API 28 (текущий минимум 21). Я знаю, что getFrameAtTime занимает микросекунды, а не миллисекунды, поэтому я * на 1000   -  person Salah Hammouda    schedule 29.04.2019
comment
Наркотик. Моя ошибка, я прочитал это как преобразование в мс. Можете ли вы убедиться, что метаданные возвращают правильную длину видео? Не знаю, поможет ли это, но это еще один способ получить продолжительность   -  person charliebeckwith    schedule 29.04.2019
comment
Да, время в порядке, как я уже сказал, оно отлично работает для длинных видео, проблема с короткими видео   -  person Salah Hammouda    schedule 29.04.2019
comment
просто проверка. Я бы попробовал возиться с параметром option, например, используя OPTION_NEXT_SYNC?   -  person charliebeckwith    schedule 29.04.2019
comment
пробовал все..   -  person Salah Hammouda    schedule 29.04.2019
comment
Похоже, что в функции есть ошибка — обнаружена ошибка github для FFmpegMediaMetadataRetriever, о котором вы упомянули, также не сработал. Их предложение состоит в том, чтобы передать время за несколько мс до времени последнего кадра. Удачи.   -  person charliebeckwith    schedule 01.05.2019
comment
@charliebeckwith спасибо за ваше время :)   -  person Salah Hammouda    schedule 01.05.2019