jiangdongguo / AndroidUSBCamera

🔥🔥🔥Flexible and useful UVC camera engine on Android platform, supporting multi-road cameras!
https://juejin.cn/post/7115229806844706847
Apache License 2.0
2.31k stars 784 forks source link

grab frames for opencv #546

Closed molisorme closed 1 year ago

molisorme commented 1 year ago

hi i read issues about how to use addPreviewDataCallBack and use onPreviewData to grab frames byte array but cant figure out how to make it work. can you provide a simple code example in Fragment or Activity?

jiangdongguo commented 1 year ago
public class UVCFragment extends MultiCameraFragment implements ICameraStateCallBack, IStateCallback, IPreviewDataCallBack {
    @Override
    protected void onCameraConnected(@NonNull MultiCameraClient.ICamera camera) {
        Logger.INSTANCE.i(TAG, "camera connected, id = " + camera.getUsbDevice().getDeviceName());
        camera.openCamera(mViewBinding.tvCameraRender, getCameraRequest());
        camera.setPreviewDataCallBack(this);
        camera.setCameraStateCallBack(this);
        AusbcPusher.getInstance().init(getContext(), getAusbcConfig(camera), this);

    }

    @Override
    protected void onCameraDisConnected(@NonNull MultiCameraClient.ICamera camera) {
        Logger.INSTANCE.i(TAG, "camera connected, id = " + camera.getUsbDevice().getDeviceId());
        camera.closeCamera();
        AusbcPusher.getInstance().destroy();
    }

    @Override
    protected void onCameraAttached(@NonNull MultiCameraClient.ICamera camera) {
        Logger.INSTANCE.i(TAG, "camera attached, id = " + camera.getUsbDevice().toString());
    }

    @Override
    protected void onCameraDetached(@NonNull MultiCameraClient.ICamera camera) {
        Logger.INSTANCE.i(TAG, "camera detached, id = " + camera.getUsbDevice().getDeviceId());
    }

    private CameraRequest getCameraRequest() {
        return new CameraRequest.Builder()
                .setPreviewWidth(1280)
                .setPreviewHeight(720)
                .create();
    }

    @Override
    public void onCameraState(@NonNull MultiCameraClient.ICamera camera, @NonNull State code, @Nullable String msg) {
        switch (code) {
            case OPENED:
                isCameraOpened = true;
                handleCameraOpened();
                break;
            case CLOSED:
                isCameraOpened = false;
                handleCameraClosed();
                break;
            case ERROR:
                isCameraOpened = false;
                ToastUtils.show(TextUtils.isEmpty(msg) ? "未知异常" : Objects.requireNonNull(msg));
                break;
        }
    }

    @Override
    public void onPreviewData(@Nullable byte[] data, @NonNull DataFormat format) {
        if (data == null) {
            return;
        }
        AusbcPusher.getInstance().pushStream(1, data, data.length, System.currentTimeMillis() * 1000);
    }
}
molisorme commented 1 year ago

thank you. I really appreciate that.

openmotion commented 1 year ago

do you have a kotlin version, in a fragment ? thanks because for me addPreviewDataCallBack is not fired