uvc摄像头 安卓,手机uvc功能怎么打开
一、android app 如何与uvc摄像头通讯
来看看是怎么*作UVC摄像头的吧.我们实现了一个专门检测UVC摄像头的服务:UVCCameraService类,主要代码如下:
监听
mUSBMonitor= new USBMonitor(this, new USBMonitor.OnDeviceConnectListener(){@Override
public void onAttach(final U**Device device){
Log.v(TAG,"onAttach:"+ device);
mUSBMonitor.requestPermission(device);
}@Override
public void onConnect(final U**Device device, final USBMonitor.U**ControlBlock 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 U**Device device, final USBMonitor.U**ControlBlock 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(U**Device u**Device){
releaseCamera();
}@Override
public void onDettach(final U**Device device){
Log.v(TAG,"onDettach:");
releaseCamera();// AppContext.getInstance().bus.post(new UVCCameraDisconnect());
}
});123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
这个类主要实现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.u**.action.USB_DEVICE_ATTACHED"/>
</intent-filter>
<intent-filter>
<action android:name="android.hardware.u**.action.USB_DEVICE_DETACHED"/>
</intent-filter>
<meta-data android:name="android.hardware.u**.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter"/>
</activity>1234567891011121314151617181920
然后,的代码在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();
}
});
}
});
}
}
});
}12345678910111213141516171819202122232425262728293031323334353637
这样,整个推送就完成了.如果一切顺利,应当能在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("停止");
}
}
});
}123456789101112131415161718192021
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
##获取更多信息##
二、vivox60手机摄像头兼容UVC吗
不支持。
UVC全称为USB Video Class,即:USB视频类,是一种为USB视频捕获设备定义的协议标准。是Microsoft与另外几家设备厂商联合推出的为USB视频捕获设备定义的协议标准,已成为USB org标准之一。
vivo X60是vivo公司于2020年12月发布的手机产品;于2021年1月8日上市。 vivo X60采用直板设计,为玻璃机身,搭载6.56英寸全面屏设计;机身长度为159.63毫米,宽度为75.01毫米,厚度为7.36毫米,重量为176.2克;配有华彩、微光、原力三种颜色。vivo X60搭载搭载了基于Android 11的搭配OriginOS系统,采用三星 Exynos 1080的CPU;四摄像头(后三);电池容量为4300毫安;为全网通手机,采用双卡槽。
三、手机uvc功能怎么打开
手机uvc功能打开:首先**个安卓USB检测程序,插入UVC摄像头,在程序中检测看是在/dev/video中新增了节点,还是在/bus/u**下新增了节点,如果没新增video节点,则没有UVC驱动。
相关的灯有强紫外线高压水银灯、高强金属卤素灯、晒版灯、毛细管超高压水银灯、光清洗灯、光盘专用灯、紫外线铁灯、*菌消*灯、短弧氙气灯、准分子放电灯。
UVC工业相机:
这些设备(如IDS生产的USB UVC相机)的优点是它们在运行时不需要安装特殊的驱动程序,因为标准的UVC驱动程序能让不同制造商生产的产品之间可相互兼容。因此,用户只需将相机连接到电脑上,便可直接进行图像传输。
支持 USB Video Class(UVC) standard 1.1可以让相机在所有的作业系统以及平台中使用(Windows, Linux, Mac etc.)。用户只需连接相机便可进行图像传输,而无需安装任何驱动程序。
UVC相机适合作为工业网络相机在视频会议、站亭系统、小型设备生产、物流业等应用中使用。