微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

FFmpegFrameGrabber每次为视频提供相同的帧

如何解决FFmpegFrameGrabber每次为视频提供相同的帧

我正在尝试使用Android中JavaCV的FFmpegFrameGrabber从视频中提取帧并获取每个帧的平均颜色。我的输出为我提供了所有帧相同的颜色,考虑到我正在处理的视频类型,情况则不会如此。我不能说为什么我在 avgColorArr 中获得所有相同的颜色。请帮我解决这个问题。

private ArrayList<Bitmap> getFrames(){
    try {
        String path = "/storage/emulated/0/pulse.mp4";
        InputStream inputStream = new FileInputStream(path);
        ArrayList<Bitmap> bitmapArray = new ArrayList<>();
        bitmapArray.clear();
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(path);
        AndroidFrameConverter converterToBitMap = new AndroidFrameConverter();
        grabber.start();
        int count = 0;
        Frame frame;
        while(true){
            frame = grabber.grabFrame();
            if (frame == null) {
                break;
            }
            if (frame.image == null) {
                continue;
            }
            count++;
            Log.i("frame","loop number" + count);
            Bitmap bitmap = converterToBitMap.convert(frame);
            bitmapArray.add(bitmap);
        }
        return bitmapArray;
    } catch(Exception e) {
        Log.e("frame error: ",e.toString());
        System.out.println(e.toString());
    }
    return null;
}

对于平均颜色

private ArrayList<Integer> getAverageColorArray(){
    ArrayList<Bitmap> bitmapArrayList = getFrames();
    ArrayList<Integer> avgColorArr = new ArrayList<Integer>();
    long redBucket = 0;
    long greenBucket = 0;
    long blueBucket = 0;
    long pixelCount = 0;
    for(Bitmap b: bitmapArrayList){
        for (int y = 0; y < b.getHeight(); y++) {
            for (int x = 0; x < b.getWidth(); x++) {
                int c = b.getPixel(x,y);
                pixelCount++;
                redBucket += Color.red(c);
                greenBucket += Color.green(c);
                blueBucket += Color.blue(c);
            }
        }
        int red = (int)(redBucket / pixelCount);
        int green = (int)(greenBucket / pixelCount);
        int blue = (int)(blueBucket / pixelCount);
        int avgColor = Color.rgb(red,green,blue);
        avgColorArr.add(avgColor);
    }
    return avgColorArr;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。