当前位置: 首页 > news >正文

企业创建网站搬瓦工可以长期做网站

企业创建网站,搬瓦工可以长期做网站,惠州住房和城乡建设部网站,photoshop基础入门教程Android在后台读取UVC摄像头的帧数据流并推送 添加UvcCamera依赖库 使用原版的 saki4510t/UVCCamera 在预览过程中断开可能会闪退#xff0c;这里使用的是 jiangdongguo/AndroidUSBCamera 中修改的版本#xff0c;下载到本地即可。 https://github.com/jiangdongguo/AndroidU…Android在后台读取UVC摄像头的帧数据流并推送 添加UvcCamera依赖库 使用原版的 saki4510t/UVCCamera 在预览过程中断开可能会闪退这里使用的是 jiangdongguo/AndroidUSBCamera 中修改的版本下载到本地即可。 https://github.com/jiangdongguo/AndroidUSBCamera 监听UVC连接回调 mUSBMonitor USBMonitor(context, mOnDeviceConnectListener)mUSBMonitor.register()public interface OnDeviceConnectListener {void onAttach(UsbDevice device);void onDetach(UsbDevice device);void onConnect(UsbDevice device, UsbControlBlock ctrlBlock, boolean createNew);void onDisconnect(UsbDevice device, UsbControlBlock ctrlBlock);void onCancel(UsbDevice device);}检测到UVC后连接该设备 USB连接上会回调onAttach, 本地判断连接上的USB设备是否UVC,如果是的话可以尝试调用连接该对象。调用mUSBMonitor.requestPermission(cam)就会请求权限并且连接该对象。连接成功后会回调 onConnect。 var connectJob: Disposable? nulloverride fun onAttach(device: UsbDevice?) {BLLog.i(TAG, onAttach)BLLog.toast(USB_DEVICE_ATTACHED)connectJob?.dispose()connectJob CommonUtils.runDelayed(1000) {autoConnectUvcDevice()}}private fun autoConnectUvcDevice() {val context BLSession.getApplicationContext()val filter: ListDeviceFilter DeviceFilter.getDeviceFilters(context, R.xml.device_filter_uvc)val devs: ListUsbDevice mUSBMonitor?.getDeviceList(filter[0]) ?: listOf()val cam findUsbCam(devs)BLLog.log2File(TAG, autoConnect 共有USB数量${devs.size}, Uvc: ${cam?.productName})if (cam null) {BLLog.i(TAG, 未连接USB摄像头)} else {mUSBMonitor.requestPermission(cam)}}device_filter_uvc.xml usbusb-device class239 subclass2 / !-- all device of UVC -- /usb如何判断该连接对象是UVC对象,如果名字中包含USBCam或 interfaceClass USB_CLASS_VIDEO private fun findUsbCam(devs: ListUsbDevice): UsbDevice? {for (dev in devs) {if (Build.VERSION.SDK_INT Build.VERSION_CODES.LOLLIPOP) {val name dev.productName dev.manufacturerNameBLLog.i(TAG, findUsbCam name:$name)if (name.contains(USBCam)) {return dev}for (i in 0 until dev.interfaceCount) {val inter dev.getInterface(i)BLLog.i(TAG, getInterface($i):$inter)if (inter.interfaceClass UsbConstants.USB_CLASS_VIDEO) {return dev}}}}return null}在onConnect中保存UvcCamera对象 override fun onConnect(device: UsbDevice?,ctrlBlock: USBMonitor.UsbControlBlock?,createNew: Boolean) {BLLog.i(TAG, onConnect ${device?.productName})synchronized(mSync) {try {// 保存最新的Uvc对象val camera UVCCamera();camera.open(ctrlBlock)BLLog.log2File(TAG,supportedSize: camera.supportedSize thread: Thread.currentThread().name)if (applyPreviewSize(camera)) {mUVCCamera?.destroy()mUVCCamera camerapreviewStatus PreViewStatus.None} else {BLLog.console(TAG, UVC不支持此分辨率$defPreviewSize)if (mUVCCamera null) {mUVCCamera camera}}uvcChangedSub.onNext(true)} catch (e:Exception){BLLog.log2File(TAG, onConnect Recv exception: $e)}}}预览并获取YUC视频帧 如果需要预览到UI中显示需要创建SurfaceView或者TextureView. mUVCCamera?.setPreviewDisplay(previewSurface)mUVCCamera?.startPreview()如果不需要预览到UI中显示可以new一个SurfaceTexture对象传进去即可必须要调用预览才能获取到YUV数据。 val surfaceTexture SurfaceTexture(0)mUVCCamera?.setPreviewTexture(surfaceTexture)BLLog.i(TAG, startPreviewWithAir)mUVCCamera?.startPreview()预览后获取YUV帧流 val width mUVCCamera?.previewSize?.width ?: defPreviewSize.widthval height mUVCCamera?.previewSize?.height ?: defPreviewSize.heightyuvCallback callbackmUVCCamera?.setFrameCallback({ buffer: ByteBuffer - // BLLog.i(TAG, onFrame ${width}*${height})// yuv格式if (acceptFrame()) {val format MediaFormat.createVideoFormat(, width, height)val data ByteArray(buffer.remaining())buffer.get(data)val frame YuvFrameData(format, data, width, height)yuvCallback?.onGetYuvData(frame)}}, UVCCamera.PIXEL_FORMAT_NV21)获取到的YUV帧可以使用其他推流SDK进行推流即可比如使用阿里云推流SDK推流。 这完成可以在后台进行推流不需要UI上展示节省设备的性能。 连接类参考 // Uvc设备连接器 object UvcConnector : BaseBussModel(ModelType.Shared) {private val TAG UvcConnector::class.java.simpleNameprivate val KEY_UVC_PREVIEW_SIZE KEY_UVC_PREVIEW_SIZE// 默认支持640*480, 1920*1080private var defPreviewSize MySize.parseSize(1920*1080)!!enum class PreViewStatus {None,Visible,Air,}private lateinit var mUSBMonitor: USBMonitorVolatileprivate var mUVCCamera: UVCCamera? nullprivate val mSync Object()private var previewStatus PreViewStatus.NoneVolatileprivate var yuvCallback: IMediaKit.OnYuvListener? null// 状态变更消息private var uvcChangedSub PublishSubject.createBoolean()override fun onStartUp() {super.onStartUp()BLLog.i(TAG, onStartUp)val context BLSession.getApplicationContext()mUSBMonitor USBMonitor(context, mOnDeviceConnectListener)mUSBMonitor.register()CommonUtils.runAsync(::loadPreviewSize)}override fun onShutdown() {BLLog.i(TAG, onShutdown)mUSBMonitor.unregister()mUSBMonitor.destroy()super.onShutdown()}fun hasUvcDevice(): Boolean {return mUVCCamera ! null}fun previewStatus(): PreViewStatus {return previewStatus}fun getSubject() uvcChangedSubfun getNowSize(): MySize? {return mUVCCamera?.previewSize?.let {MySize(it.width, it.height)}}fun getExpSize(): MySize {return defPreviewSize}fun startPreview(previewSurface: Surface): CallResult {BLLog.i(TAG, startPreview)if (!hasUvcDevice()) {return CallResult(false, 未连接设备)}if (previewStatus PreViewStatus.Air) {mUVCCamera?.stopPreview()}if (!applyPreviewSize(mUVCCamera)) {BLLog.console(TAG, UVC不支持此分辨率$defPreviewSize)return CallResult(false, UVC不支持此分辨率$defPreviewSize)}mUVCCamera?.setPreviewDisplay(previewSurface)mUVCCamera?.startPreview()previewStatus PreViewStatus.Visibleif (yuvCallback ! null) {setYuvCallback(yuvCallback!!)}uvcChangedSub.onNext(true)return CallResult(true, 成功)}fun stopPreview() {BLLog.i(TAG, stopPreview)if (previewStatus ! PreViewStatus.Visible) {return}mUVCCamera?.stopPreview()previewStatus PreViewStatus.None// 需要接收数据if (yuvCallback ! null) {startPreviewWithAir()setYuvCallback(yuvCallback!!)}uvcChangedSub.onNext(true)}fun clearYuvCallback() {yuvCallback nullif (previewStatus PreViewStatus.Air) {mUVCCamera?.stopPreview()previewStatus PreViewStatus.NoneuvcChangedSub.onNext(true)}}fun setYuvCallback(callback: IMediaKit.OnYuvListener): Boolean {if (mUVCCamera null) {return false}if (previewStatus PreViewStatus.None) {startPreviewWithAir()}val width mUVCCamera?.previewSize?.width ?: defPreviewSize.widthval height mUVCCamera?.previewSize?.height ?: defPreviewSize.heightyuvCallback callbackmUVCCamera?.setFrameCallback({ buffer: ByteBuffer - // BLLog.i(TAG, onFrame ${width}*${height})// yuv格式if (acceptFrame()) {val format MediaFormat.createVideoFormat(, width, height)val data ByteArray(buffer.remaining())buffer.get(data)val frame YuvFrameData(format, data, width, height)yuvCallback?.onGetYuvData(frame)}}, UVCCamera.PIXEL_FORMAT_NV21)return true}private fun acceptFrame(): Boolean {return Random.nextInt(30) 25}private fun startPreviewWithAir() {if (!applyPreviewSize(mUVCCamera)) {BLLog.console(TAG, UVC不支持此分辨率$defPreviewSize)return}val surfaceTexture SurfaceTexture(0)mUVCCamera?.setPreviewTexture(surfaceTexture)BLLog.i(TAG, startPreviewWithAir)mUVCCamera?.startPreview()previewStatus PreViewStatus.AiruvcChangedSub.onNext(true)}private fun findUsbCam(devs: ListUsbDevice): UsbDevice? {for (dev in devs) {if (Build.VERSION.SDK_INT Build.VERSION_CODES.LOLLIPOP) {val name dev.productName dev.manufacturerNameBLLog.i(TAG, findUsbCam name:$name)if (name.contains(USBCam)) {return dev}for (i in 0 until dev.interfaceCount) {val inter dev.getInterface(i)BLLog.i(TAG, getInterface($i):$inter)if (inter.interfaceClass UsbConstants.USB_CLASS_VIDEO) {return dev}}}}return null}private fun autoConnectUvcDevice() {val context BLSession.getApplicationContext()val filter: ListDeviceFilter DeviceFilter.getDeviceFilters(context, R.xml.device_filter_uvc)val devs: ListUsbDevice mUSBMonitor?.getDeviceList(filter[0]) ?: listOf()val cam findUsbCam(devs)BLLog.log2File(TAG, autoConnect 共有USB数量${devs.size}, Uvc: ${cam?.productName})if (cam null) {BLLog.i(TAG, 未连接USB摄像头)} else {mUSBMonitor.requestPermission(cam)}}private fun applyPreviewSize(camera: UVCCamera?):Boolean {if (camera null){return false}try {camera.setPreviewSize(defPreviewSize.width,defPreviewSize.height,UVCCamera.FRAME_FORMAT_MJPEG)} catch (e: IllegalArgumentException) {BLLog.log2File(TAG, setPreviewSize1 $defPreviewSize: $e)try {// fallback to YUV modecamera.setPreviewSize(defPreviewSize.width,defPreviewSize.height,UVCCamera.DEFAULT_PREVIEW_MODE)} catch (e1: IllegalArgumentException) {BLLog.log2File(TAG, setPreviewSize2 $defPreviewSize: $e1)return false}}return true}private val mOnDeviceConnectListener: USBMonitor.OnDeviceConnectListener object : USBMonitor.OnDeviceConnectListener {var connectJob: Disposable? nulloverride fun onAttach(device: UsbDevice?) {BLLog.i(TAG, onAttach)BLLog.toast(USB_DEVICE_ATTACHED)connectJob?.dispose()connectJob CommonUtils.runDelayed(1000) {autoConnectUvcDevice()}}override fun onDetach(device: UsbDevice?) {BLLog.i(TAG, onDetach)BLLog.toast(USB_DEVICE_DETACHED)synchronized(mSync) {if (mUVCCamera ! null) {mUVCCamera?.destroy()mUVCCamera nullpreviewStatus PreViewStatus.NoneuvcChangedSub.onNext(true)}}}override fun onConnect(device: UsbDevice?,ctrlBlock: USBMonitor.UsbControlBlock?,createNew: Boolean) {BLLog.i(TAG, onConnect ${device?.productName})synchronized(mSync) {try {// 保存最新的Uvc对象val camera UVCCamera();camera.open(ctrlBlock)BLLog.log2File(TAG,supportedSize: camera.supportedSize thread: Thread.currentThread().name)if (applyPreviewSize(camera)) {mUVCCamera?.destroy()mUVCCamera camerapreviewStatus PreViewStatus.None} else {BLLog.console(TAG, UVC不支持此分辨率$defPreviewSize)if (mUVCCamera null) {mUVCCamera camera}}uvcChangedSub.onNext(true)} catch (e:Exception){BLLog.log2File(TAG, onConnect Recv exception: $e)}}}override fun onDisconnect(device: UsbDevice?, ctrlBlock: USBMonitor.UsbControlBlock?) {BLLog.i(TAG, onDisconnect ${device?.productName})synchronized(mSync) {mUVCCamera?.destroy()mUVCCamera nullpreviewStatus PreViewStatus.NoneuvcChangedSub.onNext(true)}}override fun onCancel(device: UsbDevice?) {BLLog.i(TAG, onCancel)}}fun setPreviewSize(size: MySize) {defPreviewSize sizeSharedPreferenceHelper.saveCustom(KEY_UVC_PREVIEW_SIZE, size.toString())}private fun loadPreviewSize() {val str SharedPreferenceHelper.loadCustom(KEY_UVC_PREVIEW_SIZE, )defPreviewSize MySize.parseSize(str) ?: defPreviewSize} }
http://www.hkea.cn/news/14498127/

相关文章:

  • 建网站大概多少费用门户网站管理系统
  • cms高端建站玉环县建设局网站
  • 电子商务网站免费模板天堂 在线地址8
  • 晋城市城乡建设局网站电子商务网站网络安全设计方案
  • 网站关键词添加后的后果前端开发入门薪水
  • 淮安网站建设费用网页设计与网站建设景点介绍
  • 做最优秀的自己的视频网站英文网站建设 深圳
  • 建站建设流程为什么招聘网站做不大
  • 阿里云服务器 个人网站分销系统开发多少费用
  • 重庆怎么做网站?苏州网站的优化
  • centos6.5 wordpress网站优化入门免费教程
  • 微信登录建设银行网站wordpress gif封面
  • 怎样创建网站的基本流程wordpress wp_head
  • 网站做seo需要哪些准备大良营销网站建设教程
  • 中国网站建设中心2_网站建设的一般步骤包含哪些
  • 企业网站需求方案wordpress友情链接美化
  • 网站建设与管理需要什么软件有哪些方面广东住房和城乡建设厅网站首页
  • soho建设外贸网站中铁建设集团招聘官网
  • wangz网站建设开发网站网页归档
  • 快速网站排名提升论文网站建设与运营
  • 贵州住房和城乡建设局网站沈阳网站建设设计报价
  • 南通通州区城乡建设局网站网站可以做外部链接吗
  • 我的世界做壁纸网站打不开自己做的网站如何管理
  • 营销型网站服务M97 网站建设网络公司整站源码
  • 展示形网站怎么建营销网址大全
  • 吉木萨尔县建设局网站wordpress网站聊天插件
  • 建设银行论坛网站福田附近公司做网站建设多少钱
  • 做棋牌网站合法吗国内做化妆刷的比较好的网站
  • 建设个人网站用什么软件好河北住房与城乡建设部网站
  • 学校网站建设项目可行性分析报告郑州网站网站建设