UVCAndroid, Thư viện phát triển máy ảnh UVC cho Android (Hỗ trợ nhiều màn hình xem trước và nhiều máy ảnh)

Tổng quan

UVCAndroid là thư viện chung dành cho phát triển ứng dụng máy ảnh UVC trên nền tảng Android.

Nguồn mã mở: https://github.com/shiyinghan/UVCAndroid

Tính năng chính

  • Phát hiện thiết bị camera USB và hiển thị hình ảnh thời gian thực
  • Chụp ảnh định dạng JPG với tùy chọn điều chỉnh chất lượng nén
  • Ghi video định dạng MP4, hỗ trợ tắt âm thanh và thiết lập tham số ghi
  • Lấy danh sách độ phân giải hỗ trợ và chuyển đổi độ phân giải
  • Xác định tự động độ phân giải cho các loại camera khác nhau
  • Xoay camera 90°, 180°, 270°
  • Điều chỉnh các thông số như độ tương phản, độ sáng, màu sắc, độ bão hòa, cân bằng trắng v.v.
  • Hỗ trợ nhiều màn hình xem trước và nhiều camera đồng thời
  • Tương thích Android 5.0 trở lên

Cách triển khai

1. Thêm dependency vào dự án

Bước 1: Thêm kho lưu trữ mavenCentral vào file build.gradle của project

allprojects {
    repositories {
        ...
        mavenCentral()
    }
}

Bước 2: Thêm dependency vào module app

dependencies {
    implementation 'com.herohan:UVCAndroid:1.0.12'
}

2. Yêu cầu quyền truy cập

List<String> requiredPermissions = new ArrayList<>();
requiredPermissions.add(Manifest.permission.CAMERA);
requiredPermissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
//requiredPermissions.add(Manifest.permission.MANAGE_EXTERNAL_STORAGE); // Android 11+
requiredPermissions.add(Manifest.permission.RECORD_AUDIO);

XXPermissions.with(context)
    .permission(requiredPermissions)
    .request((perms, granted) -> {
        if(!granted) return;
        // Thực hiện xử lý camera
    });

3. Khởi tạo đối tượng quản lý camera

private CameraHelper camHelper;
private SurfaceView previewSurface;
private CameraHelper.StateCallback stateCb;

stateCb = new CameraHelper.StateCallback() {
    @Override
    public void onDeviceAttached(UsbDevice device) {
        camHelper.selectDevice(device);
    }

    @Override
    public void onCameraOpened(UsbDevice device) {
        camHelper.startPreview();
        Size currentSize = camHelper.getPreviewSize();
        if(currentSize != null) {
            previewSurface.setAspectRatio(currentSize.width, currentSize.height);
        }
        camHelper.addSurface(previewSurface.getHolder().getSurface());
    }

    @Override
    public void onPreviewStarted() {
        // Xử lý khi bắt đầu xem trước
    }
};

camHelper = new CameraHelper();
camHelper.setStateCallback(stateCb);

4. Giải phóng tài nguyên

camHelper.release();

5. Chức năng chụp ảnh

camHelper.setImageCaptureConfig(
    new ImageCaptureConfig()
        .setQuality(95)
        .setStoragePath(Environment.DIRECTORY_PICTURES)
);

File imgFile = new File(Environment.getExternalStoragePublicDirectory(
    Environment.DIRECTORY_PICTURES), "photo.jpg");

camHelper.takePicture(imgFile, result -> {
    if(result.isSuccessful()) {
        Toast.makeText(context, "Đã lưu ảnh", Toast.LENGTH_SHORT).show();
    }
});

6. Ghi video

camHelper.setVideoConfig(
    new VideoCaptureConfig()
        .setBitrate(5_000_000)
        .setFrameRate(30)
        .setAudioEnabled(true)
);

File videoFile = new File(Environment.getExternalStoragePublicDirectory(
    Environment.DIRECTORY_MOVIES), "video.mp4");

camHelper.startRecording(videoFile, status -> {
    if(status == RecordingStatus.COMPLETED) {
        Toast.makeText(context, "Hoàn thành ghi video", Toast.LENGTH_SHORT).show();
    }
});

7. Thay đổi thông số xem trước

camHelper.stopPreview();
camHelper.setPreviewFormat(UVCCamera.PIXEL_FORMAT_NV21);
camHelper.setPreviewSize(640, 480);
camHelper.startPreview();

8. Điều khiển thông số camera

UVCControl control = camHelper.getControl();

// Thiết lập độ sáng
seekBarSang.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        control.setBrightness(progress);
    }
});

// Tự động điều chỉnh độ sáng
autoSang.setChecked(control.isAutoBrightness());

9. Xoay và phản chiếu hình ảnh

// Xoay camera 90 độ
camHelper.setPreviewRotation(90);

// Phản chiếu ngang
camHelper.setMirror(Mirror.HORIZONTAL);

10. Hiển thị nhiều màn hình

camHelper.addSurface(surface1.getHolder().getSurface());
camHelper.addSurface(surface2.getHolder().getSurface());
camHelper.addSurface(surface3.getHolder().getSurface());

11. Sử dụng nhiều camera

CameraHelper leftCam = new CameraHelper();
CameraHelper rightCam = new CameraHelper();

leftCam.setStateCallback(leftCallback);
rightCam.setStateCallback(rightCallback);

leftCam.selectDevice(leftDevice);
rightCam.selectDevice(rightDevice);

API bổ sung

Phương thứcMô tả
getDeviceList()Lấy danh sách thiết bị UVC hiện có
getSupportedResolutions()Liệt kê độ phân giải hỗ trợ
getFrameData()Lấy dữ liệu khung hình theo định dạng
closeCamera()Đóng kết nối camera
isRecording()Kiểm tra trạng thái ghi video

Tải demo

Tải ứng dụng demo APK

Tham khảo

Thư viện gốc: saki4510t/UVCCamera

Thẻ: Android UVC Camera Development USB Camera Video Capture

Đăng vào ngày 27 tháng 6 lúc 18:13