uvc摄像头 安卓,手机uvc功能怎么打开

seosqwseo3个月前 (06-24)测评日记29

一、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相机适合作为工业网络相机在视频会议、站亭系统、小型设备生产、物流业等应用中使用。

相关文章

创维(Skyworth)创维电视65A3测评怎么样

创维(Skyworth)创维电视65A3测评怎么样

很多小伙伴在关注创维(Skyworth)创维电视65A3怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起...

小米(MI)电视使用反馈分享

小米(MI)电视使用反馈分享

很多小伙伴在关注小米(MI)电视怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

酷开(coocaa)创维使用感受分享

酷开(coocaa)创维使用感受分享

很多小伙伴在关注酷开(coocaa)创维怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

三星(SAMSUNG)UA55AU8800JXXZ好用吗

三星(SAMSUNG)UA55AU8800JXXZ好用吗

很多小伙伴在关注三星(SAMSUNG)UA55AU8800JXXZ怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的...

LG55英寸C2质量怎么样

LG55英寸C2质量怎么样

很多小伙伴在关注LG55英寸C2怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

小白D1接入米家APP智能可视门铃无线电子猫眼1080P高清摄像头家用监控器持久续航手机远程查看怎么样?质量测评好不好用?

小白D1接入米家APP智能可视门铃无线电子猫眼1080P高清摄像头家用监控器持久续航手机远程查看怎么样?质量测评好不好用?

很多小伙伴在关注小白D1接入米家APP智能可视门铃无线电子猫眼1080P高清摄像头家用监控器持久续航手机远程查看怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用...