android - 为实时计算机视觉处理获得高 FPS 的方法

标签 android camera frame-rate

我的目标是获得尽可能高的 FPS。我会对 BW 小帧感到满意,但 FPS 应该是最大的。 getSupportedPreviewFpsRange 在 HTC WildFire S 上返回 (9, 30)。但是当我尝试用最简单的处理绘制预览图像时,它在视觉上最大达到 12-15 FPS。 设置参数和 startPreview() 方法调用后,我这样做:

camera.setPreviewCallback(new Camera.PreviewCallback() {
          @Override
          public void onPreviewFrame(byte[] bytes, Camera camera) {
            Bitmap bitmap = Bitmap.createBitmap(size.width, size.height, Bitmap.Config.ARGB_8888);
            int[] colors = new int[size.width * size.height];
            for (int i=0; i < colors.length; i++){
              colors[i] = getBWColor(bytes[i]);
            }
            bitmap.setPixels(colors, 0, size.width, 0, 0, size.width, size.height);
            secondView.setImageBitmap(bitmap);
          }
        });
      }

private static int getBWColor(byte b){
    int res = 255;
    for(int i=0;i<3;i++){
      res = (res << 8) + b;
    }
    return res;
  }

有什么办法可以尽快拿到吗? =(

最佳答案

首先,使用setPreviewCallbackWithBuffer() ,它重复使用一个缓冲区并且不必在每一帧上分配新的缓冲区。查看我的older answer , 有一个如何使用它的例子。

然后,不要在 onPreviewFrame() 中做任何昂贵的操作,数据的时间是有限的,它会在每个新帧上被重写。您应该在另一个线程中进行处理。

当然,不要在每一帧的颜色数组中创建新的位图,只创建一次。

关于android - 为实时计算机视觉处理获得高 FPS 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8649751/

相关文章:

android - Android 中 Holder 的 Recyclerview 滚动问题

swift - 拍照后拍摄的图像被挤压 : Swift

OpenGL gluLookAt() 未按预期工作

FFMPEG 在使用 rtsp-simple-server 降低 FPS 和通过 RTSP 流式传输时保持质量

ios - 获取视频 IOS 6 的所有帧

python - 使用 ffmpeg-python 设置转换后的输出文件的帧率

java - Android 主线程上的网络使用情况

android - 删除行后更新 Recyclerview 列表

java - 电池电压是否与其电量/百分比直接对应?

android - Android Camera 参数中, PictureSize() 、 PreviewSize 和显示尺寸之间的关系是什么?