预览相机帧未捕获安卓



我有代码设置(显然不正确,但似乎还可以)

我捕获帧的测试代码是这样的:

frameCallback = new Camera.PreviewCallback() {
        public void onPreviewFrame(byte[] data, Camera camera) {
            System.out.println("preview frame captured");

但此onPreviewFrame永远不会运行,正如 print 语句所测试的那样。

奇怪的是,预览完美地显示在我的表面上。 即 - 我可以在屏幕上看到它并且没有错误。那为什么不叫onPreviewFrame呢?

这是我的所有代码供参考:

public class HuntActivity extends AppCompatActivity implements SurfaceHolder.Callback{
    Camera camera;
    SurfaceView surfaceView;
    SurfaceHolder surfaceHolder;
    Camera.PreviewCallback frameCallback;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hunt);
        surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        frameCallback = new Camera.PreviewCallback() {
            public void onPreviewFrame(byte[] data, Camera camera) {
                System.out.println("preview frame captured");
            }
        };
    }
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        try {camera = Camera.open();
        } catch (RuntimeException e) {
            System.err.println(e);
            return;
        }
        camera.setPreviewCallback(frameCallback);
        Camera.Parameters param;
        param = camera.getParameters();
        param.setPreviewSize(800, 480);
        camera.setDisplayOrientation(90);
        camera.setParameters(param);
        try {
            camera.setPreviewDisplay(surfaceHolder);
            camera.startPreview();
        } catch (Exception e) {
            System.err.println(e);
            return;
        }
    }
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        refreshCamera();
    }
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        camera.stopPreview();
        camera.release();
        camera = null;
    }
    public void refreshCamera() {
        if (surfaceHolder.getSurface() == null) {return;}
        try {camera.stopPreview();
        } catch (Exception e){}
        try {
            camera.setPreviewDisplay(surfaceHolder);
            camera.startPreview();
        } catch (Exception e) {}
    }
refreshCamera();

不要在那里调用该函数。它将停止预览功能,然后才能使用它。

将以下代码移动到onSurfaceChanged()并使用宽度和高度参数

    Camera.Parameters param;
    param = camera.getParameters();
    //param.setPreviewSize(800, 480);        
    param.setPreviewSize(width, height);
    ... and the rest of those lines...

切勿对 800x480 等分辨率进行硬编码

尝试解锁

camera.unlock();
camera.reconnect();
frameCallback.setPreviewCallback(mCallback);

最新更新