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