尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

3 步跑通手机 USB OTG 摄像头:AndroidUSBCamera 实战指南

3 步跑通手机 USB OTG 摄像头:AndroidUSBCamera 实战指南 3 步跑通手机 USB OTG 摄像头AndroidUSBCamera 实战指南【免费下载链接】Android-USB-OTG-Camera项目地址: https://gitcode.com/gh_mirrors/an/Android-USB-OTG-Camera想让一台免驱的 UVC 摄像头在手机上出画面你会先卡在哪一步权限、帧格式、Surface 生命周期哪一环没处理好都会得到一块黑屏。AndroidUSBCamera 项目基于 UVCCamera 把设备检测、权限申请、预览、拍照、MP4 录像整条链路做了高封装几行 API 就能出第一帧。这篇文章带你走一遍从环境准备到跑通的完整过程兼容 Android 5.010.0。项目速览它替你封装了什么AndroidUSBCamera 是一个高度封装的 UVCUSB Video Class摄像头开发库你只需要提供一块 TextureView剩下的设备监控、连接、预览、编码都交给它。即插即用USBMonitor实时监控设备接入/拔出自动回调全功能拍照、MP4 录像、H.264/AAC 裸流输出、480P/720P/1080P 切换参数可调亮度、对比度等 Model 参数实时读写附带示例 App跑一遍 demo 比看十页文档更快适合做工业检测、直播采集、教学录屏的 Android 开发者尤其是没写过 USB Host 代码的人。场景地图USB 摄像头最常被用在哪先说结论这个库能落地的方向主要有三块产线/设备检测把 UVC 摄像头接到手机上配合产线做视觉采集、设备状态远程诊断画面直接推到监控端直播与教育用外接高清摄像头替代手机内置摄像头提升网课、户外直播的画质还能录下摄像头自带麦克风的声音DIY 原型验证手上有一台免驱摄像头但不确定怎么接先 clone 仓库跑一遍示例 App半小时内就能确认你的设备能不能用接入路线图从 0 到出第一帧预览第 1 步确认环境先确认两件事你的手机支持 USB OTG且系统版本在 Android 5.0API 21到 10.0 之间。库的minSdkVersion是 21。特别注意一点如果你的目标机型是 Android 10建议把 targetSdkVersion 设为 27 或更低高版本 target 下存在一个会导致预览失败的 SDK 缺陷。第 2 步引入依赖在根build.gradle中加入 JitPack 仓库在模块build.gradle中加依赖// 根 build.gradle allprojects { repositories { maven { url https://jitpack.io } } }// 模块 build.gradle dependencies { implementation com.github.jiangdongguo:AndroidUSBCamera:2.3.4 }同时在AndroidManifest.xml声明权限录像和写文件都需要uses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGE / uses-permission android:nameandroid.permission.RECORD_AUDIO /第 3 步初始化监控流程把页面里的一块TextureView转成CameraViewInterface然后初始化单例和 USB 监控。这一步的作用是从这一刻起任何设备的插入、权限状态、连接结果都会通过监听器回调给你。mUVCCameraView (CameraViewInterface) mTextureView; mUVCCameraView.setCallback(mCallback); mCameraHelper UVCCameraHelper.getInstance(); mCameraHelper.setDefaultPreviewSize(1280, 720); mCameraHelper.initUSBMonitor(this, mUVCCameraView, mDevConnectListener);第 4 步接好两个回调首帧出来两个回调是必须写的缺一不可设备监听——插入时申请打开权限拔出时关闭相机Override public void onAttachDev(UsbDevice device) { if (!isRequest) { isRequest true; mCameraHelper.requestPermission(0); // 必须请求打开相机的权限 } } Override public void onDettachDev(UsbDevice device) { if (isRequest) { isRequest false; mCameraHelper.closeCamera(); // 必须拔出时释放 } }Surface 生命周期——Surface 创建后启动预览销毁前停掉Override public void onSurfaceCreated(CameraViewInterface view, Surface surface) { if (!isPreview mCameraHelper.isCameraOpened()) { mCameraHelper.startPreview(mUVCCameraView); isPreview true; } } Override public void onSurfaceDestroy(CameraViewInterface view, Surface surface) { if (isPreview mCameraHelper.isCameraOpened()) { mCameraHelper.stopPreview(); isPreview false; } }到这里插上摄像头、点同意权限画面就应该出来了。示例工程就在 app/src/main/java/com/jiangdg/usbcamera/view/USBCameraActivity.java可以直接对着跑。核心能力拆解四个高频 API拍一张 JPG传一个保存路径回调里拿到实际文件位置mCameraHelper.capturePicture(picPath, new AbstractUVCCameraHandler.OnCaptureListener() { Override public void onCaptureResult(String path) { Log.i(TAG, save path: path); } });录 MP4 或取 H.264/AAC 流startPusher既能落盘 MP4也能逐帧吐出裸流type 1是 H.264 视频流type 0是 AAC 音频流做直播推流时用后者RecordParams params new RecordParams(); params.setRecordPath(videoPath); params.setRecordDuration(0); // 0 不限时长 params.setVoiceClose(false); // true 关闭麦克风 mCameraHelper.startPusher(params, listener);实时调节亮度、对比度setModelValue写入、getModelValue读取配一个 SeekBar 就是完整的参数面板mCameraHelper.setModelValue(UVCCameraHelper.MODE_BRIGHTNESS, progress); mCameraHelper.setModelValue(UVCCameraHelper.MODE_CONTRAST, progress);运行时切换分辨率一行完成切换库会重新协商设备参数mCameraHelper.updateResolution(1920, 1080);进阶与二次开发想深挖看哪里如果你不满足于封装好的 API想改协议层或加自己的编码逻辑直接看这几个模块想通读源码可以git clone https://gitcode.com/gh_mirrors/an/Android-USB-OTG-Camera相机控制层libusbcamera/src/main/java/com/serenegiant/usb/UVCCamera.java——参数读写、打开关闭的底层实现设备监控libusbcamera/src/main/java/com/serenegiant/usb/USBMonitor.java——即插即用的核心编码与封装libusbcamera/src/main/java/com/serenegiant/usb/encoder/——H.264/AAC 编码、Mp4 封装Mp4MediaMuxer时间水印libusbcamera/src/main/java/org/easydarwin/sw/TxtOverlay.java——录制时叠加时间戳仅 armeabi-v7a / arm64-v8a 支持对应 so 在 libusbcamera/src/main/jniLibs/避坑指南实战中最高频的 5 个问题连上了预览却是黑屏原因帧格式不匹配。部分 USB 设备只支持 YUV 或只支持 MJPEG解法初始化时换默认帧格式mCameraHelper.setDefaultFrameFormat(UVCCameraHelper.FRAME_FORMAT_YUYV)YUV 和 MJPEG 各试一次永远检测不到设备原因要么手机本身不支持 OTG、要么 OTG 线/摄像头有问题解法先确认设备支持 OTG 并换线排除硬件问题库里会往根目录写一份诊断文件UsbCamera/failed-device.txt排查时看它Android 10 机型偶发预览失败原因Android Q SDK 的已知缺陷解法把 targetSdkVersion 降到 27 及以下拔线瞬间闪退或卡死原因相机资源没释放拔出事件和预览线程撞车解法onDettachDev里必须调closeCamera()这是文档里标注must have的清理动作录像文件打不开 / 没有声音原因存储权限未授予、空间不足或忘记声明RECORD_AUDIO解法检查 Manifest 权限和运行时授权不需要声音时用setVoiceClose(true)显式关闭避免编码空音频流行动清单照着做就能上线确认手机支持 USB OTG系统为 Android 5.0–10.0Android 10 注意 targetSdk ≤ 27仓库加 JitPack依赖AndroidUSBCamera:2.3.4Manifest 声明存储和录音权限initUSBMonitor完成监控初始化onAttachDev里申请权限Surface 回调中接好startPreview/stopPreview用capturePicture和startPusher各验证一次拍照与录像用 SeekBar 接setModelValue做亮度/对比度面板拔线场景回归测试确认onDettachDev释放资源全部勾完你手上就是一个可演示、可集成的 USB OTG 摄像头功能模块。【免费下载链接】Android-USB-OTG-Camera项目地址: https://gitcode.com/gh_mirrors/an/Android-USB-OTG-Camera创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表