最近在做一个外接USB相机的项目,github上搜了下,有很多开源的库,这些库底层基本用的都是同一套东西,但上层业务比较繁琐,使用起来很不方便,并且也不太符合项目的业务需求,所以重新封装了一下,本库只需几个简单的API即可完成预览、拍照功能,无需关注复杂的USB插拔处理逻辑。文档地址: 最好用的Android UVC Camera库
Step 1. Add the JitPack repository to your build file.Add it in your root build.gradle at the end of repositories:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
Step 2. Add the dependency
dependencies {
implementation 'com.github.Liuguihong:AndroidUVCCamera:1.0.0'
}
UVCCameraProxy mUVCCamera = new UVCCameraProxy(this);
mUVCCamera.getConfig()
.isDebug(true) // 是否调试
.setPicturePath(PicturePath.APPCACHE) // 图片保存路径,保存在app缓存还是sd卡
.setDirName("uvccamera") // 图片保存目录名称
.setProductId(0) // 产品id,用于过滤设备,不需要可不设置
.setVendorId(0); // 供应商id,用于过滤设备,不需要可不设置
支持TextureView和SurfaceView,在其生命周期里封装了注册/注销USB插拔广播、释放相机资源等逻辑,并且自动过滤USB设备,只响应USB相机插拔。
mUVCCamera.setPreviewTexture(mTextureView); // TextureView
// mUVCCamera.setPreviewSurface(mSurfaceView); // SurfaceView
mUVCCamera.setConnectCallback(new ConnectCallback() {
@Override
public void onAttached(UsbDevice usbDevice) {
mUVCCamera.requestPermission(usbDevice); // USB设备授权
}
@Override
public void onGranted(UsbDevice usbDevice, boolean granted) {
if (granted) {
mUVCCamera.connectDevice(usbDevice); // 连接USB设备
}
}
@Override
public void onConnected(UsbDevice usbDevice) {
mUVCCamera.openCamera(); // 打开相机
}
@Override
public void onCameraOpened() {
mUVCCamera.setPreviewSize(640, 480); // 设置预览尺寸
mUVCCamera.startPreview(); // 开始预览
}
@Override
public void onDetached(UsbDevice usbDevice) {
mUVCCamera.closeCamera(); // 关闭相机
}
});
mUVCCamera.setPhotographCallback(new PhotographCallback() {
@Override
public void onPhotographClick() {
mUVCCamera.takePicture();
}
});
mUVCCamera.setPreviewCallback(new PreviewCallback() {
@Override
public void onPreviewFrame(byte[] yuv) {
}
});
mUVCCamera.setPictureTakenCallback(new PictureCallback() {
@Override
public void onPictureTaken(String path) {
}
});
mUVCCamera.takePicture();
// mUVCCamera.takePicture("test.jpg"); // 自定义图片名称,不设置则根据UUID自动保存
方法 | 说明 |
---|---|
registerReceiver() | 注册USB插拔监听广播 |
unregisterReceiver() | 注销USB插拔监听广播 |
checkDevice() | 查找USB相机设备,会在onAttached里回调 |
requestPermission(UsbDevice usbDevice) | USB设备授权,要连接USB设备必须先授权 |
connectDevice(UsbDevice usbDevice) | 连接USB设备 |
closeDevice() | 关闭USB设备 |
openCamera() | 打开相机 |
closeCamera() | 关闭相机 |
setPreviewSurface(SurfaceView surfaceView) | 设置预览View为SurfaceView |
setPreviewTexture(TextureView textureView) | 设置预览View为TextureView |
setPreviewDisplay(Surface surface) | 设置预览View,自定义 |
setPreviewRotation(float rotation) | 设置相机预览旋转角度,暂时只支持TextureView |
setPreviewSize(int width, int height) | 设置预览尺寸 |
getPreviewSize() | 获取相机预览尺寸 |
getSupportedPreviewSizes() | 获取相机支持的预览尺寸 |
startPreview() | 开始预览 |
stopPreview() | 停止预览 |
takePicture() | 拍照 |
takePicture(String pictureName) | 拍照 |
isCameraOpen() | 是否已经打开相机 |
getConfig() | 获取配置信息 |
clearCache() | 删除图片缓存目录 |
https://github.com/saki4510t/UVCCamera
1)mUVCCamera.setPreviewSize(),P3X 项目Use FRAME_FORMAT_MJPEG(1)
/**
* Set preview size and preview mode
*
* @param width
* @param height
* @param frameFormat either FRAME_FORMAT_YUYV(0) or FRAME_FORMAT_MJPEG(1)
*/
public void setPreviewSize(final int width, final int height, final int frameFormat) {
setPreviewSize(width, height, DEFAULT_PREVIEW_MIN_FPS, DEFAULT_PREVIEW_MAX_FPS, frameFormat, mCurrentBandwidthFactor);
}
2)rgb 预览回调数据接口 : setFrameCallback(final IFrameCallback callback, final int pixelFormat)
pixelformat 取值:
① public static final int PIXEL_FORMAT_YUV420SP = 4; // NV12
② public static final int FRAME_FORMAT_MJPEG = 1; 是否可以取此值 ???