卧式纯绿 2024-04-19 21:43 采纳率: 26.9%
浏览 2

安卓开发抽帧出现问题

安卓开发视频抽帧处理出错
在获取到视频uri后想对视频进行抽帧处理,下面的代码是抽取第1秒的一帧后设置到imageview上进行展示

img


运行仍然出错,想知道是哪里有问题

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-19 21:43
    关注

    引自免费微信小程序:皆我百晓生

    从您提供的代码来看,看起来您正在尝试从一个视频URI中提取第一帧,并应用某种物体检测算法(这里提到的是YoLoV5 Ncnn)。然而,代码中存在一些潜在的问题,导致可能的运行错误。以下是针对您的代码的一些修改建议:

    1. 使用MediaMetadataRetriever获取视频的总时长可能会返回一个负数,因为extractMetadata()方法返回的字符串格式可能与预期不符。为了解决这个问题,我们可以先检查返回值是否为负数,如果是,则转换为正数。

    2. currentTime变量设置为1000000(1百万毫秒),这通常不会对应于视频中的第一个时间点。应将其更改为0,以便从视频的开始处提取第一帧。

    3. 调整帧间隔以确保能准确地在1秒内捕获一帧。目前的FrameInterval设置为33000L,这意味着每33毫秒抽取一帧,但为了确保精确抽取1秒内的帧,应将间隔设为1000L(1秒)。

    4. 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资源。

    如果问题依然存在,请提供详细的错误信息,以便更好地定位问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月19日

悬赏问题

  • ¥15 请问有会的吗,用MATLAB做
  • ¥15 phython如何实现以下功能?查找同一用户名的消费金额合并—
  • ¥15 ARIMA模型时间序列预测用pathon解决
  • ¥15 孟德尔随机化怎样画共定位分析图
  • ¥18 模拟电路问题解答有偿速度
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序,怎么查看客户esp32板子上程序及烧录地址
  • ¥50 html2canvas超出滚动条不显示