如何像 Snapchat 一样提高相机预览帧率?

3
在Android上,有人知道Snapchat在相机预览上如何实现如此高的帧率吗?我尝试了各种方法: - 使用TextureView代替SurfaceView - 强制开启硬件加速 - 降低分辨率 - 使用不同的预览格式(YV12,NV21会丢帧) - 更改对焦模式
但是都无法接近Snapchat似乎能够达到的持续的30fps甚至更高。我的应用程序的帧率与谷歌相机应用程序相同,但显示分辨率较低,这并不理想。
编辑:Snapchat使用的方法与官方的Android视频录制应用程序相同。那里的预览画面具有相同的图像质量,并锁定在30fps。
2个回答

3

试一下,它有效。

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

嗨,Rohit!我有点不清楚你会在哪里使用这段代码?你需要先打开相机或者其他什么操作吗?还是直接调用这个例程就可以了?干杯! - Fattie
只是为了明确 - 在这种情况下,您是如何理解“打开相机”这一概念的?(如果你没有时间别担心!:))干杯... - Fattie
@JoeBlow 感谢您添加悬赏...我会尝试为您提供更完整的示例,同时感谢Rohit提供的代码! - mbdavis
@ROHITPARMAR 这只是在按下按钮时拍摄一张照片并将其保存到SD卡中,对吗? - mbdavis
不,你可以通过连续点击按钮来拍摄多张照片。 - ROHIT PARMAR

2

我相信他们使用了Android NDK。您可以在Android开发者网站上找到更多信息。

在像图像和视频处理等性能关键任务中,使用纯C/C++比JAVA代码更快。

您还可以尝试使用另一个编译器(例如Intel编译器)编译应用程序以提高性能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接