Сначала я работал над этим некоторое время и пробовал несколько решений, поэтому не отправляйте мне первую ссылку, которую вы найдете в google.
Что мне нужно сделать, это довольно просто, я хочу вручную отобразить предварительный просмотр с камеры с помощью обратного вызова камеры, и я хочу получить по крайней мере 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. Предварительный просмотр камеры на SurfaceView (GL) с использованием NDK для обработки данных YUV. Я нашел решение здесь, в котором используется некоторая функция C и NDK. Но я не смог использовать его, здесь несколько подробнее. Но в любом случае это решение выполняется, чтобы вернуть ByteBuffer, чтобы отобразить его как текстуру в OpenGL, и это будет не быстрее, чем предыдущая попытка. Поэтому мне пришлось бы изменить его, чтобы возвратить массив int [], который можно нарисовать с помощью canvas.drawBitmap(), но я не понимаю C достаточно для этого.
Итак, есть ли какой-либо другой способ, который мне не хватает или какое-то улучшение в попытках, которые я пробовал?
Спасибо за любой ответ!