手机uvc功能怎么打开

手机uvc功能怎么打开,第1张

手机uvc功能打开:首先下载个安卓USB检测程序,插入UVC摄像头,在程序中检测看是在/dev/video中新增了节点,还是在/bus/usb下新增了节点,如果没新增video节点,则没有UVC驱动。

相关的灯有强紫外线高压水银灯、高强金属卤素灯、晒版灯、毛细管超高压水银灯、光清洗灯、光盘专用灯、紫外线铁灯、杀菌消毒灯、短弧氙气灯、准分子放电灯。

UVC工业相机:

这些设备(如IDS生产的USB UVC相机)的优点是它们在运行时不需要安装特殊的驱动程序,因为标准的UVC驱动程序能让不同制造商生产的产品之间可相互兼容。因此,用户只需将相机连接到电脑上,便可直接进行图像传输。

支持 USB Video Class (UVC) standard 1.1可以让相机在所有的作业系统以及平台中使用(Windows, Linux, Mac etc.)。用户只需连接相机便可进行图像传输,而无需安装任何驱动程序。

UVC相机最适合作为工业网络相机在视频会议、站亭系统、小型设备生产、物流业等应用中使用。

实现的方法有很多种,按步骤来看适合哪一种,网上说什么接采集卡,其实就是把AV转成UVC,现在市面上很多摄像头直接就已经是UVC的了,在windows上面即插即用。

安卓也是Linux,这个就好办了。

首先个安卓USB检测程序,插入UVC摄像头,在程序中检测看是在/dev/video中新增了节点,还是在/bus/usb下新增了节点。如果没新增video节点,则没有UVC驱动。如果你有很多个usb口子,可以连电脑,在adb shell中输入ls -l /dev/v*,查看是否生成了新的节点。

2.如果没有新增节点,有3个办法。1是自己写一个video固件,通常平板上都有前后两个摄像头,video0和video1都已经被占用,是无法通过这两个来调用外置摄像头的。2是干掉一个前置或者后置摄像头,这样就可以让外置USB用video0或video1来启动,这就是为什么在没有摄像头的安卓上能成功。3是找到系统的源码,配置其中的UVC驱动,编译后再安装。

3如果新增了节点那就好办了,如果板子上已经有2个摄像头,自己写个程序调用ID为3的camera就好了;如果没有2个摄像头,那直接用系统自带的相机程序前后切换就可以看到USB的信息了。如果是AV通过采集卡转换的UVC,还能在相机应用里看DVD(*^__^*) 嘻嘻。

常见的一些问题:

新增的固件无法访问。其实就是Linux的权限问题,只要权限是0666以上就可以了。chmod 0666 /dev/video3 或者 chmod 777 /dev/video3 ,video几是看你新增的是哪个。

来看看是怎么 *** 作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())

}

})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 = uvcCameraif (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 = uvcCameraif (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-dataandroid:name="android.hardware.usb.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

## 获取更多信息 ##


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/bake/11899190.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存