【问题标题】:android - why onpreviewframe doesn't work well?android - 为什么 onpreviewframe 不能正常工作?
【发布时间】:2016-07-17 05:39:18
【问题描述】:

我使用以下代码设置了预览回调

   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 个回调缓冲区,并且为了打开相机,我使用了另一个线程来提高帧率:

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

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

【问题讨论】:

  • 任何在软件中对来自相机的大帧数据(即byte[])进行操作的东西迟早会达到性能极限。你想做什么?
  • 编码字节并写入文件。

标签: android android-camera android-mediacodec


【解决方案1】:

我大约 4 天前遇到了这个问题。 我了解您的问题是 fps 低:我做了以下操作,

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

【讨论】:

  • 我的代码有点不同,但我相信这样可以:Log.i(TAG,Chosenresolution: "+mSize.width+" "+mSize.height); params.setPictureSize(mSize.width , mSize.height); mCamera.setParameters(params);
  • 我做到了,但没有任何改变。
  • 要对onPreviewFrame 产生影响,您需要更改preview 大小而不是picture 大小。
  • 我无法使用这些设置修复 fps。
【解决方案2】:

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

删除:

parameters.setPreviewFpsRange(30000, 30000);

也许你可以使用下面的代码:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-16
    • 2019-01-04
    • 2020-09-03
    • 2016-10-10
    • 2016-10-24
    • 2017-02-27
    • 2017-07-08
    • 2014-11-23
    相关资源
    最近更新 更多