Android使用UVCCamera打开USBCamera-预览

news/2024/11/29 15:10:14/
  1. 导入libuvccamera.aar

  2. 写一个管理类封装UVCCamera相关API

    import android.content.Context
    import android.hardware.usb.UsbDevice
    import android.os.Handler
    import android.os.HandlerThread
    import android.os.Message
    import android.util.Log
    import android.view.Surface
    import com.serenegiant.usb.DeviceFilter
    import com.serenegiant.usb.IFrameCallback
    import com.serenegiant.usb.USBMonitor
    import com.serenegiant.usb.UVCCamera
    import java.nio.ByteBufferclass UsbCameraManager(mContext:Context) :IFrameCallback{private val TAG = "UsbCameraManager"private var handlerThread = HandlerThread("UsbCameraManager")private var usbMonitor:USBMonitor?=nullprivate var handler: Handler?=nullprivate var uvcCamera:UVCCamera?=nullprivate var mPreviewSurface: Surface? = nullprivate val OPEN_CAMERA = 1init {handlerThread.start()handler = object : Handler(handlerThread.looper){override fun handleMessage(msg: Message) {super.handleMessage(msg)when(msg.what){OPEN_CAMERA->{openCamera(msg.obj as USBMonitor.UsbControlBlock)}}}}usbMonitor = USBMonitor(mContext,object :USBMonitor.OnDeviceConnectListener{override fun onAttach(device: UsbDevice?) {Log.i(TAG, "onAttach ${device?.deviceId}")val filter = DeviceFilter.getDeviceFilters(mContext, com.serenegiant.uvccamera.R.xml.device_filter)usbMonitor?.let {val devices: List<UsbDevice> = it.getDeviceList(filter[0])if (devices != null && devices.isNotEmpty()) {val cameraDevice = devices[0]it.requestPermission(cameraDevice)} else {Log.i(TAG, "连接失败")}}}override fun onDettach(device: UsbDevice?) {Log.i(TAG, "onDettach ${device?.deviceId}")}override fun onConnect(device: UsbDevice?, ctrlBlock: USBMonitor.UsbControlBlock?, createNew: Boolean) {Log.i(TAG, "onConnect ${device?.deviceId}")ctrlBlock?.let {var message = Message().apply {what = OPEN_CAMERAobj = it}handler?.sendMessage(message)}}override fun onDisconnect(device: UsbDevice?, ctrlBlock: USBMonitor.UsbControlBlock?) {Log.i(TAG, "onDisconnect ${device?.deviceId}")stop()}override fun onCancel(device: UsbDevice?) {Log.i(TAG, "onCancel ${device?.deviceId}")stop()}})}public fun start(mSurface: Surface){mPreviewSurface = mSurfaceusbMonitor?.register()}private fun openCamera(ctrlBlock: USBMonitor.UsbControlBlock){if (uvcCamera != null){stop()}uvcCamera = UVCCamera()uvcCamera?.open(ctrlBlock)uvcCamera?.setPreviewDisplay(mPreviewSurface)uvcCamera?.setPreviewSize(1920,1080)uvcCamera?.setFrameCallback(this,UVCCamera.PIXEL_FORMAT_NV21)uvcCamera?.startPreview()}override fun onFrame(frame: ByteBuffer?) {frame?.let {val length = it.capacity()it.clear()var tmpBuf = ByteArray(length)frame[tmpBuf, 0, length]Log.i(TAG,"onFrame $frame.length")}}public fun stop(){uvcCamera?.stopPreview()uvcCamera?.close()uvcCamera?.destroy()uvcCamera = null}
    }
    
  3. 添加预览界面

        <TextureViewandroid:id="@+id/preview_view"android:layout_width="match_parent"android:layout_height="match_parent"/>
    
  4. 获取TextureView的Surface,开启预览

    		previewView = findViewById(R.id.preview_view)previewView?.surfaceTextureListener = object : TextureView.SurfaceTextureListener {override fun onSurfaceTextureAvailable(p0: SurfaceTexture, p1: Int, p2: Int) {val surface = Surface(p0)usbCameraManager?.start(surface)}override fun onSurfaceTextureSizeChanged(p0: SurfaceTexture, p1: Int, p2: Int) {}override fun onSurfaceTextureDestroyed(p0: SurfaceTexture): Boolean {return false}override fun onSurfaceTextureUpdated(p0: SurfaceTexture) {}}usbCameraManager = UsbCameraManager(mContext)
    

http://www.ppmy.cn/news/1550926.html

相关文章

利用zabbix自定义脚本监控MySQL基础状态

1、 mysql_monitor.sh 主要关注mysql的这些状态&#xff1a; uptime| version| questions| slowQueries| select| bytesSent| bytesReceived| ping| activeThread| connectThread| maxConnect| bigSql| bigTransaction | innodbLock| primaryKey| dbRole| readonly| superRead…

深入解析分布式遗传算法及其Python实现

目录 深入解析分布式遗传算法及其Python实现目录第一部分:分布式遗传算法的背景与原理1.1 遗传算法概述1.2 分布式遗传算法的引入1.3 分布式遗传算法的优点与挑战优点:挑战:第二部分:分布式遗传算法的通用Python实现2.1 基本组件的实现第三部分:案例1 - 基于多种交叉与变异…

bp(二)利用java安装破解bp

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

systemverilog约束中:=和:/的区别

“x dist { [100:102] : 1, 200 : 2, 300 : 5}” 意味着其值等于100或101或102或200或300其中之一&#xff0c; 其权重比例为1:1:1:2:5 “x dist { [100:102] :/ 1, 200 : 2, 300 : 5}” 意味着等于100&#xff0c;101&#xff0c;102或200&#xff0c;或300其…

YunSDR通信小课堂-5

第2讲 单音信号自收发测试 2.1 实验目的 1. 掌握YunSDR的基本使用和配置方法&#xff1b; 2. 掌握MATLAB网络通信基本原理&#xff1b; 3. 理解数据的收发过程。 2.2 实验器材 YunSDR一台&#xff0c;PC机一台&#xff0c;Matlab2013a&#xff08;或更高版本&#xff09;&a…

使用开源GCC编译微软WMI相关函数的示例代码

如下代码是使用国产RedPanda-Cpp的编译工具编译的&#xff0c;该工具使用简单&#xff1b; 该方式是调用微软的WMI接口相关函数 但是使用GCC编译会出现编译不过的问题&#xff0c;很多代码库的函数都不存在&#xff1b; 在编译时&#xff0c;需要添加这些库文件&#xff1a;…

golang 实现比特币内核:如何接入 RPC 后端获得特定交易的二进制数据

我们非常关注解析比特币的二进制数据,这使得我们的工作看起来是可行的。比特币是一个分布式网络系统,这意味着它需要全球各地的节点协同工作,甚至比特币核心库也需要连接其他节点来帮助它,就像查询交易费一样。 世界上没有免费的午餐。当你使用比特币系统进行交易时,你需…

ssm189基于Java的在线教育平台设计与实现+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;在线教育平台的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为…