Цель: извлечь все кадры из видео, обработать кадры в модели машинного обучения и построить новое видео из этих обработанных кадров.
Проблема: в настоящее время я могу извлекать кадры из видео, но с очень низкой скоростью. Около 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
.
Может ли кто-нибудь дать мне какие-либо намеки, как достичь этой цели???