android - 为什么onpreviewframe不能正常工作?

时间:2016-03-29 15:08:01

标签: android android-camera mediacodec

我使用以下代码设置previewcallback

   mCamera.setPreviewCallback(new Camera.PreviewCallback() {
                @Override
                public void onPreviewFrame(final byte[] bytes, Camera camera) {
                    if (recording == true) {
                        count++;
                        Log.e("frame","frame number is "+count);
                        if(mThread.isAlive()) {
                            encode(bytes);
                        }

                    }
                }
            });

我还添加了10个callbackbuffer,对于oppening相机,我使用另一个线程来增加帧率:

  public void newOpenCamera() {
    if (mThread == null) {
        mThread = new CameraHandlerThread();
    }

    synchronized (mThread) {
        mThread.openCamera();
    }
}

private static void oldOpenCamera() {
    try {
        c = Camera.open(1);
        Camera.Parameters parameters = c.getParameters();
        parameters.set("orientation", "portrait");
        parameters.setJpegQuality(100);
        parameters.setPreviewFormat(ImageFormat.NV21);
        parameters.setPreviewSize(640, 480);
        for(int i=0;i<10;i++){
            byte[] buffer = new byte[(ImageFormat.getBitsPerPixel(parameters.getPreviewFormat())*640*480)/8+1];
            c.addCallbackBuffer(buffer);
        }
        parameters.setPreviewFrameRate(30);
        parameters.setPreviewFpsRange(30000,30000);
        c.setParameters(parameters);
    }
    catch (RuntimeException e) {
        Log.e("camera", "failed to open front camera");
    }
}

public CameraHandlerThread mThread = null;
public static class CameraHandlerThread extends HandlerThread {
    Handler mHandler = null;


    CameraHandlerThread() {
        super("CameraHandlerThread");
        start();
        mHandler = new Handler(getLooper());
    }

    synchronized void notifyCameraOpened() {
        notify();

    }

    public void openCamera() {
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                oldOpenCamera();
                notifyCameraOpened();
            }
        });
    }
}

但结果没有任何变化。 onpreviewframe中的帧数约为150,视频为15秒。有没有解决方案将帧数固定为30 fps?

2 个答案:

答案 0 :(得分:0)

我在4天前遇到过这个问题。 我知道你的问题是低fps:我做了以下,

尝试将分辨率设置为640 * 480

答案 1 :(得分:0)

如果修复fps,某些设备无法正常工作。您应该设置支持的fps范围而不是固定值。

删除:

parameters.setPreviewFpsRange(30000, 30000);

也许您可以使用以下代码:

List<int[]> supportedFPSRange = param.getSupportedPreviewFpsRange();
// fps is a range from supportedFPSRange
parameters.setPreviewFpsRange(fps[0], fps[1]);