usb camera
Android直播开发之旅(10):AndroidUSBCamera,UVCCamera开发通用库
AndroidUSBCamera基于[saki4510t/UVCCamera](https://github.com/saki4510t/UVCCamera)开发,该项目对usb camera(UVC设备)的使用和视频数据采集进行了高度封装,能够帮助开发者通过几个简单的API实现USB Camera设备的检测、连接、预览和音视频数据采集,最重要的是手机无需root,只需支持otg功能即可驱动。主要功能包括:
(1)支持USB Camera设备检测,画面实时预览;
(2)支持本地录制mp4格式视频,支持实时获取音视频数据流;
(3)支持jpg格式图片抓拍;
(4)支持获取camera支持的分辨率,和分辨率切换;
(5)支持屏蔽声音,重启Camera;
(6)支持相机自动对焦;
(7)支持调整对比度和亮度
(8)支持480P、720P、1080P and higher
如何使用AndroidUSBCamera项目
1. 添加依赖到本地工程
第一步 添加JitPack仓库到工程gradle
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 ‘http://raw.github.com/saki4510t/libcommon/master/repository/’ }
maven { url ‘https://jitpack.io’ }
}
}
第二步 添加依赖到APP Module的gradle
Step 2. Add the dependency
dependencies {
compile 'com.github.jiangdongguo:AndroidUSBCamera:1.3.8'
}
Init AndroidUSBCamera engine,register the USB device event listener
private USBCameraManager.OnMyDevConnectListener listener = new USBCameraManager.OnMyDevConnectListener() {
// 插入USB设备
@Override
public void onattachDev(UsbDevice device) {
if(mUSBManager == null || mUSBManager.getUsbDeviceCount() == 0){
showShortMsg("未检测到USB摄像头设备");
return;
}
// 请求打开摄像头
if(! isrequest){
isRequest = true;
if(mUSBManager != null){
mUSBManager.requestpermission(0);
}
}
}
// 拔出USB设备
@Override
public void onDettachDev(UsbDevice device) {
if(isRequest){
// 关闭摄像头
isRequest = false;
mUSBManager.closeCamera();
showShortMsg(device.getDeviceName()+"已拨出");
}
}
// 连接USB设备成功
@Override
public void onConnectDev(UsbDevice device,boolean isConnected) {
if(! isConnected) {
showShortMsg("连接失败,请检查分辨率参数是否正确");
isPreview = false;
}else{
isPreview = true;
}
}
// 与USB设备断开连接
@Override
public void onDisConnectDev(UsbDevice device) {
showShortMsg("连接失败");
}
};
mUVCCameraView = (CameraViewInterface) mTextureView;
mUVCCameraView.setCallback(new CameraViewInterface.Callback() {
@Override
public void onSurfaceCreated(CameraViewInterface view, Surface surface) {
if(!isPreview && mUSBManager.isCameraOpened()) {
mUSBManager.startPreview(mUVCCameraView, new AbstractUVCCamerahandler.OnPreViewResultListener() {
@Override
public void onPreviewResult(boolean result) {
}
});
isPreview = true;
}
}
@Override
public void onSurfaceChanged(CameraViewInterface view, Surface surface, int width, int height) {
}
@Override
public void onSurfaceDestroy(CameraViewInterface view, Surface surface) {
if(isPreview && mUSBManager.isCameraOpened()) {
mUSBManager.stopPreview();
isPreview = false;
}
}
});
// 初始化引擎
mUSBManager = USBCameraManager.getinstance();
mUSBManager.initUSBmonitor(this,listener);
mUSBManager.createUVCCamera(mUVCCameraView);
3. 注册USB设备广播事件监听器,开始Camera预览
Register the USB device broadcast event listener and start the Camera Preview
// 注册USB事件广播监听器
if(mUSBManager != null){
mUSBManager.registerUSB();
}
// 恢复Camera预览
if(mUVCCameraView != null){
mUVCCameraView.onResume();
}
4. 注销USB设备广播事件监听器,停止Camera预览
Unregister the USB device broadcast event listener and stop the Camera Preview
// 注销USB事件广播监听器
if(mUSBManager != null){
mUSBManager.unregisterUSB();
}
// 暂停Camera预览
if(mUVCCameraView != null){
mUVCCameraView.onpause();
}
5. 图片抓拍
Picture capturing
if(mUSBManager == null || ! mUSBManager.isCameraOpened()){
showShortMsg("抓拍异常,摄像头未开启");
return;
}
mUSBManager.capturePicture(picPath, new AbstractUVCCameraHandler.OnCaptureListener() {
@Override
public void onCaptureResult(String path) {
showShortMsg("保存路径:"+path);
}
});
6. 本地录制(可实时获取音视频数据流)
recoring mp4,and get media real-stream
if(mUSBManager == null || ! mUSBManager.isCameraOpened()){
showShortMsg("录制异常,摄像头未开启");
return;
}
if(! mUSBManager.isRecording()){
String videoPath = USBCameraManager.ROOT_PATH+system.currenttimemillis();
FileUtils.createfile(FileUtils.ROOT_PATH+"test666.h264");
Recordparams params = new RecordParams();
params.setRecordPath(videoPath);
params.setRecordDuration(0); // 设置为0,不分割保存
params.setVoiceClose(false); // 不屏蔽声音
mUSBManager.startRecording(params, new AbstractUVCCameraHandler.OnEncodeResultListener() {
@Override
public void onEncodeResult(byte[] data, int offset, int length, long timestamp, int type) {
// type = 0,aac格式音频流
// type = 1,h264格式视频流
if(type == 1){
FileUtils.putfilestream(data,offset,length);
}
}
@Override
public void onRecordResult(String videoPath) {
showShortMsg(videoPath);
}
});
// 停止录制
mUSBManager.stopRecording();
7. 切换分辨率
update Resulotion
mUSBManager.updateResolution(this, mUVCCameraView, 320, 240, new USBCameraManager.OnPreviewListener() {
@Override
public void onPreviewResult(boolean isSuccess) {
if(! isSuccess) {
showShortMsg("预览失败,不支持该分辨率");
}else {
showShortMsg("以切换到分辨率为320x240");
}
}
});
// 获取Camera支持得分辨率
List<Size> list = mUSBManager.getSupportedPreviewSizes();
// Camera自动对焦
mUSBManager.startCameraFoucs();
8. 释放引擎资源
release resource
// 释放资源
if(mUSBManager != null){
mUSBManager.release();
}
9. 添加权限
add permissions
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
USBCameraManager API (Other)
(1) void requestPermission(int index):请求授予开启USB摄像头权限;
(2) int getUsbDeviceCount():返回查询到的可用USB Camera数目;
(3) boolean isRecording():判断是否正在录制视频;
(4) boolean isCameraOpened():判断USB摄像头是否正常打开;
(5) void release():释放资源
(6) USBMonitor getUSBMonitor():返回USBMonitor实例;
(7) mUSBManager.setModelValue(USBCameraManager.MODE_CONTRAST,contrast++); 调整对比度
(8) mUSBManager.setModelValue(USBCameraManager.MODE_BRIGHTNESS,brightness++);调整亮度
注:在使用Android Studio移植UVCCamera时,很多朋友可能会遇到”open(“/dev/bus/usb/001/002”, O_RDWR, 0),报错,permission denied”问题,这是由于Android Studio使用的ndk版本所致,建议使用ndk-r14即可。解决方法:local.properties–>指定ndk.dir版本。(注:这里使用的是离线方式)
最新版为2.1.0,使用方法请移步Github项目
GitHub源码地址:https://github.com/jiangdongguo/AndroidUSBCamera(如果对您有用,欢迎star&fork以表支持~谢谢^_^!)
上面是原博主的下载地址,有可能下载后无法运行,我调试好后上传了一份新的
https://download.csdn.net/download/qq_31939617/10642906
相关阅读
动态性网页页面的开发环境依据开发设计视频语音不一样而不一样,关键的方法取决于Python开发设计、JSP开发设计和ASP开发设计的
网站开发应该注意的事项。大多数人可能会觉得做网站很难,其实它并不是一个难题,只要你把一个网站开发的基本流程弄明白了,你就会
网站开发手机端一起多少钱?之前很多网站建立时候只是考虑PC端也就是电脑端,没有考虑用户在手机上浏览网站的效果。那么,电脑站在手
一款成功的APP开发产品,产品的定位是极其重要的,产品定位决定了接下来围绕产品的一系列工作:如何确定产品工作的优先级?需要围绕产品
Java代码 <pre name="code" class="java">ContentResolver cr = getContentResolver();Cursor cursor = cr.query(ContactsContr