【发布时间】:2021-09-14 23:00:45
【问题描述】:
目标:要从视频中提取所有帧,在机器学习模型中处理这些帧,并从这些处理过的帧中重建一个新视频。
问题:我目前能够从视频中提取帧,但速度非常慢。大约每秒 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 库,但我没有看到准确有效地提取所有帧的方法(也许我错过了它?)。我想要一个像grabeAllFrames 这样的方法,而不是在getFrameAtTime 中使用时间间隔。
谁能给我任何提示如何实现这个目标???
【问题讨论】:
标签: android video-processing mediametadataretriever