安卓开发视频抽帧处理出错
在获取到视频uri后想对视频进行抽帧处理,下面的代码是抽取第1秒的一帧后设置到imageview上进行展示
运行仍然出错,想知道是哪里有问题
安卓开发视频抽帧处理出错
在获取到视频uri后想对视频进行抽帧处理,下面的代码是抽取第1秒的一帧后设置到imageview上进行展示
引自免费微信小程序:皆我百晓生
从您提供的代码来看,看起来您正在尝试从一个视频URI中提取第一帧,并应用某种物体检测算法(这里提到的是YoLoV5 Ncnn)。然而,代码中存在一些潜在的问题,导致可能的运行错误。以下是针对您的代码的一些修改建议:
使用MediaMetadataRetriever
获取视频的总时长可能会返回一个负数,因为extractMetadata()
方法返回的字符串格式可能与预期不符。为了解决这个问题,我们可以先检查返回值是否为负数,如果是,则转换为正数。
currentTime
变量设置为1000000(1百万毫秒),这通常不会对应于视频中的第一个时间点。应将其更改为0,以便从视频的开始处提取第一帧。
调整帧间隔以确保能准确地在1秒内捕获一帧。目前的FrameInterval
设置为33000L,这意味着每33毫秒抽取一帧,但为了确保精确抽取1秒内的帧,应将间隔设为1000L(1秒)。
在performObjectDetection
方法中,确保正确处理可能出现的异常情况,例如空对象数组。
下面是修改后的代码示例:
private void processVideo(Uri videoUri) {
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(context, videoUri);
// 获取总时长,确保返回正值
String durationStr = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
long videoDurationMs = durationStr.startsWith("-") ? -Long.parseLong(durationStr.substring(1)) : Long.parseLong(durationStr);
// 初始化帧间隔为1秒
long frameInterval = 1000L;
List<Bitmap> frames = new ArrayList<>();
Bitmap bitmap1 = null, updatedBitmap = null;
// 提取并展示第一帧
long currentTime = 0;
bitmap1 = retriever.getFrameAtTime(currentTime, MediaMetadataRetriever.OPTION_CLOSEST);
if (bitmap1 != null) {
YoLoV5Ncnn.obj[] objs = yolov5ncnn.detect(bitmap1, use_gpu: true);
try {
updatedBitmap = performObjectDetection(objs);
if (updatedBitmap != null) {
imageView.setImageBitmap(updatedBitmap);
}
} catch (Exception e) {
Log.e("Object Detection", "Error occurred during object detection: ", e);
}
}
// 清理资源
retriever.release();
}
// 假设这是您的对象检测方法,这里仅作为示例,实际实现根据您的需求调整
public Bitmap performObjectDetection(YoLoV5Ncnn.obj[] objs) throws Exception {
// 对象检测逻辑...
return processedBitmap;
}
这段代码首先修复了获取视频时长的问题,然后调整了帧间隔以确保在1秒内抽取一帧。同时,对performObjectDetection
方法添加了异常处理,这样当发生错误时,可以记录日志而不是让应用程序崩溃。最后,别忘了在完成后释放MediaMetadataRetriever
资源。
如果问题依然存在,请提供详细的错误信息,以便更好地定位问题。