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ức | Mô 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
Tham khảo
Thư viện gốc: saki4510t/UVCCamera