Как получить более высокий предварительный просмотр камеры, например, snapchat?

На Android,

Кто-нибудь знает, какой трюк snapchat тянет, чтобы получить такой высокий fps на своем предварительном просмотре камеры? Я пробовал различные методы:

  • Используя текстурный вид вместо поверхностного вида
  • Заставляя аппаратное ускорение
  • Используя более низкие разрешения
  • Используя различные форматы предварительного просмотра (YV12, NV21 кадры)
  • Изменение режима фокусировки

Никто не оставил меня где-нибудь ближе к постоянному 30fps или, может быть, даже выше того, что snapchat, похоже, получит. Я могу просто перейти к тем же fps, что и приложение для Google, но это не очень удобно, и мои дисплеи имеют гораздо более низкое разрешение.

РЕДАКТИРОВАТЬ:

Используемый метод такой же, как и в официальном приложении записи видео для Android. Предварительный просмотр имеет одинаковое качество изображения и заблокирован до 30 кадров в секунду.

Я полагал, что они использовали андроид NDK. Более подробную информацию вы можете найти в разработчике Android .

Использование чистых C / C ++ быстрее, чем JAVA-код в таких важных задачах, как обработка изображений и видео.

Вы также можете попытаться повысить производительность, скомпилировав приложение с помощью другого компилятора, такого как компилятор Intel .

Попробуйте это, он работает

public void takeSnapPhoto() { camera.setOneShotPreviewCallback(new Camera.PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { Camera.Parameters parameters = camera.getParameters(); int format = parameters.getPreviewFormat(); //YUV formats require more conversion if (format == ImageFormat.NV21 || format == ImageFormat.YUY2 || format == ImageFormat.NV16) { int w = parameters.getPreviewSize().width; int h = parameters.getPreviewSize().height; // Get the YuV image YuvImage yuv_image = new YuvImage(data, format, w, h, null); // Convert YuV to Jpeg Rect rect = new Rect(0, 0, w, h); ByteArrayOutputStream output_stream = new ByteArrayOutputStream(); yuv_image.compressToJpeg(rect, 100, output_stream); byte[] byt = output_stream.toByteArray(); FileOutputStream outStream = null; try { // Write to SD Card File file = createFileInSDCard(FOLDER_PATH, "Image_"+System.currentTimeMillis()+".jpg"); //Uri uriSavedImage = Uri.fromFile(file); outStream = new FileOutputStream(file); outStream.write(byt); outStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { } } } });} 
Intereting Posts