Извлечение кадров из видео происходит слишком медленно (как в приложениях CapCut/VN/InShot) в Android, несмотря на исполJAVA

Программисты JAVA общаются здесь
Anonymous
Извлечение кадров из видео происходит слишком медленно (как в приложениях CapCut/VN/InShot) в Android, несмотря на испол

Сообщение Anonymous »

Я разрабатываю приложение для редактирования видео для Android и пытаюсь извлечь кадры из видео для предварительного просмотра на временной шкале (например, приложения CapCut, VN, InShot).
Я уже пробовал несколько подходов, но все они слишком медленные для плавной очистки временной шкалы в реальном времени:
Что я пробовал:
  • FFmpeg (JavaCV / собственный FFmpeg) build)
  • MediaMetadataRetriever
  • MediaExtractor + MediaCodec
  • Извлечение кадров OpenCV
  • Эксперименты по рендерингу на основе GPU/OpenGL
Проблема:
Все подходы медленны при последовательном извлечении кадров, особенно для:
  • прокрутки временной шкалы
  • создания миниатюр для временной шкалы видеоредактора
  • быстрого поиска с плавным предварительным просмотром
Даже MediaCodec + MediaExtractor становится медленным при непрерывном декодировании нескольких кадров.
Чего я хочу достичь:
Я хочу, чтобы производительность извлечения кадров была такой же, как в таких приложениях, как:
  • CapCut
  • VN Editor
  • InShot
Эти приложения обеспечивают:
  • мгновенную прокрутку временной шкалы
  • быстрый предварительный просмотр кадров
  • плавное создание миниатюр без задержек
Мои вопросы:
  • Как этим приложениям удается так быстро извлекать кадры?
  • Используют ли они FFmpeg, MediaCodec или собственные собственные решения?
  • Используют ли они декодирование только ключевых кадров или прокси-видео?
  • Что лучше? архитектура для быстрого извлечения видеокадров на Android?
  • Требуется ли графический процессор (OpenGL / SurfaceTexture) для такого уровня производительности?
  • Мне не хватает какой-либо техники оптимизации для MediaCodec или FFmpeg?
    Что я подозреваю:
    Может быть, они используют:
    • декодирование с аппаратным ускорением
    • только поиск ключевых кадров
    • система кэширования кадров
    • прокси-обработка видео с низким разрешением
    • Рендеринг на графическом процессоре вместо преобразования растровых изображений
    Но я не уверен, как это правильно реализовать.

Вернуться в «JAVA»