То, что мне нужно сделать, довольно просто, я хочу вручную отобразить предварительный просмотр с камеры, используя обратный вызов камеры, и я хочу получить как минимум 15 кадров в секунду на реальном устройстве. Мне даже не нужны цвета, мне просто нужно предварительно просмотреть изображение в градациях серого.
Изображения с камеры в формате YUV, и вы должны как-то обрабатывать их, что является основной проблемой производительности. Я использую API 8.
Во всех случаях я использую camera.setPreviewCallbackWithBuffer (), который работает быстрее, чем camera.setPreviewCallback (). Кажется, что я не могу получить около 24 кадров в секунду, если я не отображаю предварительный просмотр. Так что проблема не в этом.
Я пробовал эти решения:
1. Отображение предварительного просмотра камеры в SurfaceView в виде растрового изображения. Это работает, но производительность составляет около 6 кадров в секунду.
baos = new ByteOutputStream();
yuvimage=new YuvImage(cameraFrame, ImageFormat.NV21, prevX, prevY, null);
yuvimage.compressToJpeg(new Rect(0, 0, prevX, prevY), 80, baos);
jdata = baos.toByteArray();
bmp = BitmapFactory.decodeByteArray(jdata, 0, jdata.length); // Convert to Bitmap, this is the main issue, it takes a lot of time
canvas.drawBitmap(bmp , 0, 0, paint);
<ч />
2. Отобразите предварительный просмотр камеры в GLSurfaceView в качестве текстуры. Здесь я отображал только данные яркости (изображение в оттенках серого), что довольно просто, для каждого кадра требуется только одна arraycopy (). Я могу получить около 12 кадров в секунду, но мне нужно применить некоторые фильтры для предварительного просмотра, и кажется, что это не может быть сделано быстро в OpenGL ES 1. Поэтому я не могу использовать это решение. Некоторые детали этого в другой вопрос .
<Ч />
3. Отобразите предварительный просмотр камеры в (GL) SurfaceView, используя NDK для обработки данных YUV. Я нахожу решение здесь , которое использует некоторую функцию C и NDK. Но мне не удалось его использовать, вот некоторые подробности . Но в любом случае, это решение сделано для возврата ByteBuffer для отображения его в качестве текстуры в OpenGL, и он не будет быстрее, чем предыдущая попытка. Поэтому мне нужно изменить его так, чтобы он возвращал массив int [], который можно нарисовать с помощью canvas.drawBitmap (), но я недостаточно понимаю C, чтобы сделать это.
<Ч />
Итак, есть ли какой-то другой способ, который я пропускаю, или какое-то улучшение попыток, которые я пробовал?