Android Camera开发入门(4):USB/UVC Camera的使用
本文基于开源项目https://github.com/saki4510t/UVCCamera之上进行二次封装和使用
在前几篇文章中,我们介绍了Camera到CameraX的基础功能应用,同时附上了相关代码,需要的源码的大佬们可以滑到最底部获取。
本篇我们一起来了解 USB/UVC 相机是什么以及它们与传统相机的区别,并按照惯例和大家一起来输出代码。
好消息
好多小伙伴私信我说aar的方式不好用,周末特意更新了个版本,主要对日本那个开源库进行优化和去掉一些不必要的功能(如预览延时在500毫秒),同时保留JNI关联代码,熟悉C\C++的小伙伴扩展业务功能就更加方便了。
项目地址:git clone https://gitee.com/yunianvh/usb-camera.git
简介
UVC,全称为USB Video Class,是一种专门为USB视频捕获设备定义的协议标准。它是由Microsoft与其他设备厂商联合推出的,并已成为USB组织的标准之一。
环境
配置项目以支持 USB/UVC 相机。包括添加必要的权限和依赖项。我这里是已经编译好的aar包,懒得自己去编译的大佬们可以直接拿去使用;
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.usb.host"/>
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation(name: 'libusbcommon_v4.1.1', ext: 'aar')
implementation(name: 'libusbcamera-v4.1.1', ext: 'aar')
}
初始化相机
在Activity的onCreate中进行初始化
<com.serenegiant.usb.widget.UVCCameraTextureView
android:id="@+id/camera_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_usbcamera);
mUVCCameraView = (CameraViewInterface) mTextureView;
mUVCCameraView.setCallback(this);
mCameraHelper = UVCCameraHelper.getInstance();
mCameraHelper.setDefaultFrameFormat(UVCCameraHelper.FRAME_FORMAT_MJPEG);
mCameraHelper.initUSBMonitor(this, mUVCCameraView, listener);
}
在onStart和onStop中去注册和销毁
@Override
protected void onStart() {
super.onStart();
// step.2 register USB event broadcast
if (mCameraHelper != null) {
mCameraHelper.registerUSB();
}
}
@Override
protected void onStop() {
super.onStop();
// step.3 unregister USB event broadcast
if (mCameraHelper != null) {
mCameraHelper.unregisterUSB();
}
}
相关的回调方法处理代码
private UVCCameraHelper.OnMyDevConnectListener listener = new UVCCameraHelper.OnMyDevConnectListener() {
@Override
public void onAttachDev(UsbDevice device) {
// request open permission
if (!isRequest) {
isRequest = true;
if (mCameraHelper != null) {
mCameraHelper.requestPermission(0);
}
}
}
@Override
public void onDettachDev(UsbDevice device) {
// close camera
if (isRequest) {
isRequest = false;
mCameraHelper.closeCamera();
showShortMsg(device.getDeviceName() + " is out");
}
}
@Override
public void onConnectDev(UsbDevice device, boolean isConnected) {
if (!isConnected) {
isPreview = false;
} else {
isPreview = true;
}
}
@Override
public void onDisConnectDev(UsbDevice device) {
showShortMsg("disconnecting");
}
};
拍照
在初始化后调用即可
File picPath = new File(this.getExternalFilesDir(null).getAbsolutePath() + "/"+System.currentTimeMillis()+".jpg");
mCameraHelper.capturePicture(picPath, new AbstractUVCCameraHandler.OnCaptureListener() {
@Override
public void onCaptureResult(String path) {
}
});
视频录制
在初始化后调用即可
File videoPath = new File(this.getExternalFilesDir(null).getAbsolutePath() + "/"+System.currentTimeMillis()+".mp4");
RecordParams params = new RecordParams();
params.setRecordPath(videoPath);
params.setRecordDuration(0); // auto divide saved,default 0 means not divided
params.setVoiceClose(false); // is close voice
mCameraHelper.startPusher(params, new AbstractUVCCameraHandler.OnEncodeResultListener() {
@Override
public void onEncodeResult(byte[] data, int offset, int length, long timestamp, int type) {
// type = 1,h264 video stream
// type = 0,aac audio stream
}
@Override
public void onRecordResult(String videoPath) {
//录制完成返回的videoPath
}
});
总结
由于是人家封装好的项目,没什么好说的,知道怎么使用就是了。个人在实际开发过程中遇到通过帧回调方法获取数据进行编码或者直接调用项目原来录制时候的编码再进行rtmp推流时1080P延时大概在两秒左右。
最后还是通过opengl获取离屏数据的方式获取数据进行编码解决了延时问题。
DOME
该系列文章到这里也就算结束了,后续我将考虑推出更多关于不同版本之间如何添加水印、滤镜以及视频编码等相关功能的简介文章。期待与您分享更多有关相机功能的内容!如果您还有其他问题或需求,请随时告诉我们。谢谢!
gitee:https://gitee.com/yunianvh/camera-demo
github:https://github.com/yunianvh/CameraDemo文章来源:https://www.toymoban.com/news/detail-737024.html
编辑:玉念聿辉
感谢查阅文章来源地址https://www.toymoban.com/news/detail-737024.html
到了这里,关于Android Camera开发入门(4):USB/UVC Camera的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!