uvcandroid
A. vivox60手机摄像头兼容UVC吗
vivo/iQOO手机均不支持UVC。
B. android studio USB UVC摄像头 预览 失败
如下:
检查设备管理器图像处理设备下的摄像头项,显示设备正常运作无冲突。
C. android Android4.0中是不是已经加入对UVC及UAC的驱动支持
android Android4.0中已经加入对UVC及UAC的驱动支持。Android4.0可以接上外置的USB摄像头及MIC使用。
符合UVC规格的硬件设备在不需要安装任何的驱动程序下即可在主机中正常使用。使用UVC技术的包括摄像头、数码相机、类比影像转换器、电视棒及静态影像相机等设备。
UAC(USB Audio Class)USB音频类,是USB众多设备类中的一种。
D. android设备插上uvc摄像头后,怎么确定设备的节点
<6>[ 812.640000] usb 1-2.3.4: new high-speed USB device number 8 using s5p-ehci
<6>[ 812.820000] usb 1-2.3.4: New USB device found, idVendor=1908, idProct=23
10
<6>[ 812.820000] usb 1-2.3.4: New USB device strings: Mfr=1, Proct=2, SerialN
umber=3
<6>[ 812.820000] usb 1-2.3.4: Proct: USB2.0 PC CAMERA
<6>[ 812.820000] usb 1-2.3.4: Manufacturer: Generic
<6>[ 812.820000] usb 1-2.3.4: SerialNumber: 20100331010203
<6>[ 812.835000] uvcvideo: Found UVC 1.00 device USB2.0 PC CAMERA (1908:2310)
<6>[ 812.840000] input: USB2.0 PC CAMERA as /devices/platform/s5p-ehci/usb1/1-2
/1-2.3/1-2.3.4/1-2.3.4:1.0/input/input6
E. Android Studio如何配置UVC类
重新检查下JAVA_HOME,PATH,CLASSPATH。。我安装android Studio的时候也出现过你这情况,设置好了JAVA_HOME,PATH,CLASSPATH之后就能启动了重新检查下JAVA_HOME,PATH,CLASSPATH。。我安装android Studio的时候也出现过你这情况,设置好了JAVA_HOME,PATH,CLASSPATH之后就能启动了重新检查下JAVA_HOME,PATH,CLASSPATH。。我安装android Studio的时候也出现过你这情况,设置好了JAVA_HOME,PATH,CLASSPATH之后就能启动了重新检查下JAVA_HOME,PATH,CLASSPATH。。我安装android Studio的时候也出现过你这情况,设置好了JAVA_HOME,PATH,CLASSPATH之后就能启动了重新检查下JAVA_HOME,PATH,CLASSPATH。。我安装android Studio的时候也出现过你这情况,设置好了JAVA_HOME,PATH,CLASSPATH之后就能启动了重新检查下JAVA_HOME,PATH,CLASSPATH。。我安装android Studio的时候也出现过你这情况,设置好了JAVA_HOME,PATH,CLASSPATH之后就能启动了55555555666666666
F. 安卓系统上的app识别不了camera的uvc
成像的时候没转化正确,看看log。
无论使用哪种Camera的api,Camera的封装都可以大致分为两个流程:数据采集、渲染。于是我们就可以定义出这两块功能的接口:数据采集
publicinterfaceICamera{List
虽然是多个摄像头,但是我们可以用一个单例类来统一管理——UVCCameraHelper。在这个类中我们要做的事有:连接上usb摄像头设备,开启摄像头采集数据并将数据渲染到surface上,此外还需要提供拍照、视频录制等api。那么这里就需要用到UVCCcamera这个开源库了。我们需要在UVCCameraHelper定义一个USBMonitor对象,这个类的核心接口提供了USB设备的连接状态维护。
G. 安卓UⅤC什么意思
UVC,全称为:USB video class 或USB video device class
UVC是Microsoft与另外几家设备厂商联合推出的为USB视频捕获设备定义的协议标准,目前已成为USB org标准之一。
如今的主流操作系统(如Windows XPSP2and later, Linux 2.4.6 and later, MacOS 10.5 and later)都已提供UVC设备驱动,因此符合UVC规格的硬件设备在不需要安装任何的驱动程序下即可在主机中正常使用。使用UVC技术的包括摄像头、数码相机、类比影像转换器、电视棒及静态影像相机等设备。
最新的UVC版本为UVC 1.1,由USB Implementers Forum定义包括基本协议及负载格式。
网络摄像头是第一个支持UVC而且也是数量最多的UVC设备,目前,操作系统只要是 Windows XP SP2 之后的版本都可以支持 UVC,当然 Vista 就更不用说了。Linux系统自2.4以后的内核都支持了大量的设备驱动,并可以支持UVC设备。
使用 UVC 的好处 USB 在 Video这块也成为一项标准了之后,硬件在各个程序之间彼此运行会更加顺利,而且也省略了驱动程序安装这一环节。
紫外线的分类
根据生物效应的不同,将紫外线按照波长划分为四个波段:
UVA:
波段,波长320~400nm,又称为长波黑斑效应紫外线 。它有很强的穿透力,可以穿透大部分透明的玻璃以及塑料。日光中含有的长波紫外线 有超过98%能穿透臭氧层和云层到达地球表面,UVA可以直达 肌肤的真皮层,破坏弹性纤维和胶原蛋白纤维,将我们的皮肤晒黑。360nm波长的UVA紫外线符合昆虫类的趋光性反应曲线,可制作诱虫灯。300-420nm波长的UVA紫外线可透过完全截止可见光的特殊着色玻璃灯管,仅辐射出以365nm为中心的近紫外光,可用于矿石鉴定、舞台装饰、验钞等场所。
UVB:
波段,波长275~320nm,又称为中波红斑效应紫外线 。中等穿透力,它的波长较短的部分会被透明玻璃吸收,日光中含有的中波紫外线大部分被臭氧层所吸收,只有不足2%能到达地球表面,在夏天和午后会特别强烈。UVB紫外线对人体具有红斑作用,能促进体内矿物质代谢和维生素D的形成,但长期或过量照射会令皮肤晒黑,并引起红肿脱皮。紫外线保健灯、植物生长灯发出的就是使用特殊透紫玻璃(不透过254nm以下的光)和峰值在300nm附近的荧光粉制成。
UVC:
紫外线的UVC波段,波长200~275nm,又称为短波灭菌紫外线。它的穿透能力是最弱的,无法穿透大部分的透明玻璃及塑料。日光中含有的短波紫外线几乎被臭氧层完全吸收。短波紫外线对人体的伤害很大,短时间照射即可灼伤皮肤,长期或高强度照射还会造成皮肤癌。紫外线杀菌灯发出的就是UVC短波紫外线。
UVD:
波段,波长100~200nm,又称为真空紫外线。
H. 安卓系统手机怎么装uvc
具体可以参考如下操作:
1、首先下载个安卓USB检测程序,插入UVC摄像头,在程序中检测看是在/dev/video中新增了节点,还是在/bus/usb下新增了节点,如果没新增video节点,则没有UVC驱动;
2、如果没有新增节点,有3个办法:一是自己写一个video固件,通常平板上都有前后两个摄像头,video0和video1都已经被占用,是无法通过这两个来调用外置摄像头的;二是干掉一个前置或者后置摄像头,这样就可以让外置USB用video0或video1来启动,这就是为什么在没有摄像头的安卓上能成功;三是找到系统的源码,配置其中的UVC驱动,编译后再安装;
3、如果新增了节点那就好办了,如果板子上已经有2个摄像头,自己写个程序调用ID为3的camera就好了;如果没有2个摄像头,那直接用系统自带的相机程序前后切换就可以看到USB的信息了。如果是AV通过采集卡转换的UVC,还能在相机应用里看;
I. android app 如何与uvc摄像头通讯
来看看是怎么操作UVC摄像头的吧.我们实现了一个专门检测UVC摄像头的服务:UVCCameraService类,主要代码如下:
监听
mUSBMonitor = new USBMonitor(this, new USBMonitor.OnDeviceConnectListener() { @Override
public void onAttach(final UsbDevice device) {
Log.v(TAG, "onAttach:" + device);
mUSBMonitor.requestPermission(device);
} @Override
public void onConnect(final UsbDevice device, final USBMonitor.UsbControlBlock ctrlBlock, final boolean createNew) {
releaseCamera(); if (BuildConfig.DEBUG) Log.v(TAG, "onConnect:"); try { final UVCCamera camera = new MyUVCCamera();
camera.open(ctrlBlock);
camera.setStatusCallback(new IStatusCallback() { // ... uvc 摄像头链接成功
Toast.makeText(UVCCameraService.this, "UVCCamera connected!", Toast.LENGTH_SHORT).show(); if (device != null)
cameras.append(device.getDeviceId(), camera);
}catch (Exception ex){
ex.printStackTrace();
}
} @Override
public void onDisconnect(final UsbDevice device, final USBMonitor.UsbControlBlock ctrlBlock) { // ... uvc 摄像头断开链接
if (device != null) {
UVCCamera camera = cameras.get(device.getDeviceId()); if (mUVCCamera == camera) {
mUVCCamera = null;
Toast.makeText(UVCCameraService.this, "UVCCamera disconnected!", Toast.LENGTH_SHORT).show();
liveData.postValue(null);
}
cameras.remove(device.getDeviceId());
}else {
Toast.makeText(UVCCameraService.this, "UVCCamera disconnected!", Toast.LENGTH_SHORT).show();
mUVCCamera = null;
liveData.postValue(null);
}
} @Override
public void onCancel(UsbDevice usbDevice) {
releaseCamera();
} @Override
public void onDettach(final UsbDevice device) {
Log.v(TAG, "onDettach:");
releaseCamera();// AppContext.getInstance().bus.post(new UVCCameraDisconnect());
}
});
这个类主要实现UVC摄像头的监听\链接\销毁\反监听.当有UVC摄像头链接成功后,会创建一个mUVCCamera对象.
然后在MediaStream里, 我们改造了switchCamera,当参数传2时,表示要切换到UVCCamera(0,1分别表示切换到后置\前置摄像头).
创建
在创建摄像头时,如果是要创建uvc摄像头,那直接从服务里面获取之前创建的mUVCCamera实例:
if (mCameraId == 2) {
UVCCamera value = UVCCameraService.liveData.getValue(); if (value != null) { // uvc camera.
uvcCamera = value;
value.setPreviewSize(width, height,1, 30, UVCCamera.PIXEL_FORMAT_YUV420SP,1.0f); return; // value.startPreview();
}else{
Log.i(TAG, "NO UVCCamera");
uvcError = new Exception("no uvccamera connected!"); return;
} // mCameraId = 0;
}123456789101112131415
预览
在预览时,如果uvc摄像头已经创建了,那执行uvc摄像头的预览操作:
UVCCamera value = uvcCamera;if (value != null) {
SurfaceTexture holder = mSurfaceHolderRef.get(); if (holder != null) {
value.setPreviewTexture(holder);
} try {
value.setFrameCallback(uvcFrameCallback, UVCCamera.PIXEL_FORMAT_YUV420SP/*UVCCamera.PIXEL_FORMAT_NV21*/);
value.startPreview();
cameraPreviewResolution.postValue(new int[]{width, height});
}catch (Throwable e){
uvcError = e;
}
}1234567891011121314
这里我们选的colorFormat为PIXEL_FORMAT_YUV420SP 相当于标准摄像头的NV21格式.
关闭预览
同理,关闭时,调用的是uvc摄像头的关闭.
UVCCamera value = uvcCamera; if (value != null) {
value.stopPreview();
}1234
销毁
因为我们这里并没有实质性的创建,所以销毁时也仅将实例置为null就可以了.
UVCCamera value = uvcCamera;if (value != null) { // value.destroy();
uvcCamera = null;
}12345
有了这些操作,我们看看上层怎么调用,
首先需要在Manifest里面增加若干代码,具体详见UVCCamera工程说明.如下:
<activity android:name=".UVCActivity" android:launchMode="singleInstance">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
</activity>
然后,的代码在UVCActivity里,这个类可以在library分支的myapplication工程里找到.即这里.
启动或者停止UVC摄像头推送:
public void onPush(View view) { // 异步获取到MediaStream对象.
getMediaStream().subscribe(new Consumer<MediaStream>() { @Override
public void accept(final MediaStream mediaStream) throws Exception { // 判断当前的推送状态.
MediaStream.PushingState state = mediaStream.getPushingState(); if (state != null && state.state > 0) { // 当前正在推送,那终止推送和预览
mediaStream.stopStream();
mediaStream.closeCameraPreview();
}else{ // switch 0表示后置,1表示前置,2表示UVC摄像头
// 异步开启UVC摄像头
RxHelper.single(mediaStream.switchCamera(2), null).subscribe(new Consumer<Object>() { @Override
public void accept(Object o) throws Exception { // 开启成功,进行推送.
// ...
mediaStream.startStream("cloud.easydarwin.org", "554", id);
}
}, new Consumer<Throwable>() { @Override
public void accept(final Throwable t) throws Exception { // ooop...开启失败,提示下...
t.printStackTrace();
runOnUiThread(new Runnable() { @Override
public void run() {
Toast.makeText(UVCActivity.this, "UVC摄像头启动失败.." + t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
});
}
}
});
}
这样,整个推送就完成了.如果一切顺利,应当能在VLC播放出来UVC摄像头的视频了~~
我们再看看如何录像.也非常简单…
public void onRecord(View view) { // 开始或结束录像.
final TextView txt = (TextView) view;
getMediaStream().subscribe(new Consumer<MediaStream>() { @Override
public void accept(MediaStream mediaStream) throws Exception { if (mediaStream.isRecording()){ // 如果正在录像,那停止.
mediaStream.stopRecord();
txt.setText("录像");
}else { // 没在录像,开始录像...
// 表示最大录像时长为30秒,30秒后如果没有停止,会生成一个新文件.依次类推...
// 文件格式为test_uvc_0.mp4,test_uvc_1.mp4,test_uvc_2.mp4,test_uvc_3.mp4
String path = getExternalFilesDir(Environment.DIRECTORY_MOVIES) + "/test_uvc.mp4";
mediaStream.startRecord(path, 30000); final TextView pushingStateText = findViewById(R.id.pushing_state);
pushingStateText.append("\n录像地址:" + path);
txt.setText("停止");
}
}
});
}21
UVC摄像头还支持后台推送,即不预览的情况下进行推送,同时再切换到前台继续预览.只需要调用一个接口即可实现,如下:
@Overridepublic void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) {
ms.setSurfaceTexture(surfaceTexture); // 设置预览的surfaceTexture}@Overridepublic boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
ms.setSurfaceTexture(null); // 设置预览窗口为null,表示关闭预览功能
return true;
}123456789
如果要彻底退出uvc摄像头的预览\推送,那只需要同时退出服务即可.
public void onQuit(View view) { // 退出
finish(); // 终止服务...
Intent intent = new Intent(this, MediaStream.class);
stopService(intent);
}1234567
## 获取更多信息 ##