Самый быстрый способ извлечь все кадры из видео в студии Android?

Цель: извлечь все кадры из видео, обработать кадры в модели машинного обучения и построить новое видео из этих обработанных кадров.

Проблема: в настоящее время я могу извлекать кадры из видео, но с очень низкой скоростью. Около 2 кадров в секунду. Я хочу ускорить его хотя бы до 10-20 кадров в секунду.

Я использую собственный класс Android MediaMetadataRetriever для извлечения кадров как Bitmap и сохранения их в List

Вот код:

fun getAllFrames(uri: Uri): List<Bitmap> {
    val frameList = ArrayList<Bitmap>()

    setDataSource(context, uri)

    // playback duration (in ms) of the data source.
    val duration: String? = extractMetadata(METADATA_KEY_DURATION)
    val durationMillis = duration!!.toInt()
    val durationMicros = durationMillis * 1000

    // to get a video output with 30fps (input can be 60 or 30fps)
    val fps30 = ((1000/30)*1000).toLong()

    for (i in 0L..durationMicros step fps30) {

        val frame = getFrameAtTime(i, OPTION_CLOSEST)

        frame?.let {
           frameList.add(frame)
        }
    }

    return frameList
}

Я просмотрел библиотеки ffmpeg и javaCV, но не нашел метода, который бы точно и эффективно извлекал все кадры (может быть, я пропустил?). Вместо использования временного интервала в getFrameAtTime мне нужен такой метод, как grabeAllFrames.

Может ли кто-нибудь дать мне какие-либо намеки, как достичь этой цели???


person Junior    schedule 03.07.2021    source источник


Ответы (1)


Почти все видео, которые вы обрабатываете, будут закодированы в том или ином формате, и эти форматы кодирования, например. h.264, как правило, сжимает видео для экономии памяти и полосы пропускания.

Компромисс заключается в том, что вам нужно проделать работу, чтобы распаковать видео и получить каждый кадр, и чем «эффективнее» кодек (кодировщик), тем больше работы ему обычно приходится выполнять.

Большинство устройств имеют выделенные пути аппаратного ускорения для декодирования и отображения распространенных форматов кодирования видео, но они обычно оптимизированы для отображения, а не для анализа и изменения видео.

Если у вас есть возможность выполнять работу на стороне сервера, это обычно намного проще из-за большей доступной вычислительной мощности, а также, возможно, из-за более широкого набора библиотек и служб, которые могут быть доступны.

Если вам нужно работать на мобильном телефоне, возможно, стоит взглянуть на OpenCV для Android с оговоркой, что его может быть сложно скомпилировать и что документация обычно основана на eclipse.

Конечно, вы сможете добиться более 2 кадров в секунду, если ваш анализ каждого кадра не слишком требователен к процессору.

Хорошим простым примером для начала является обнаружение цветового клуба, которое обнаруживает объект или каплю определенного цвета в каждом кадре: https://github.com/opencv/opencv/tree/master/samples/android./color-blob-detection/src/org/opencv/samples/colorblobdetect

Этот ответ содержит аннотированный отрывок, объясняющий, как это работает: https://stackoverflow.com/a/40918718/334402

Стоит добавить, что варианты использования машинного обучения также могут требовать процессора и времени, поэтому это может быть комбинация того и другого, которая замедляет вас в вашем случае использования.

person Mick    schedule 14.07.2021