mbdavis
mbdavis

Reputation: 4010

How to get higher camera preview fps like snapchat?

On Android,

Anyone have any idea what trick snapchat pulls to get such high fps on their camera preview? I have tried various methods:

None have left me anywhere close to the constant 30fps or maybe even above that snapchat seems to get. I can just about get to the same fps as the stock google camera app, but this isn't great, and mine displays at much lower resolution.

EDIT:

The method used is the same as that used by the official android video recording app. The preview there is of the same image quality and is locked to 30fps.

Upvotes: 3

Views: 16284

Answers (2)

We're All Mad Here
We're All Mad Here

Reputation: 1554

I believed they used the android NDK. You can find more information in android developer.

Using pure C/C++ is faster than JAVA code in performance critical tasks such as image and video processing.

You can also try to improve the performance by compiling the application with another compiler, like the Intel compiler.

Upvotes: 2

ROHIT PARMAR
ROHIT PARMAR

Reputation: 931

try this it works

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 {
            }
        }
    }
});}

Upvotes: 3

Related Questions