目标:要从视频中提取所有帧,在机器学习模型中处理这些帧,并从这些处理过的帧中重建一个新视频。
问题:我目前能够从视频中提取帧,但速度非常慢。大约每秒 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
andjavaCV
库,但我没有看到准确有效地提取所有帧的方法(也许我错过了它?)。而不是在 中使用时间间隔getFrameAtTime
,我想要一个类似的方法grabeAllFrames
。
谁能给我任何提示如何实现这个目标???