终于搞定android驱动USB摄像头了!(zz)

http://www.eoeandroid.com/thread-252676-1-1.html

多亏了stackoverflow看到的一篇帖子,其中有几句关键的话,然后顺藤摸瓜解决了问题。
帖子大意:
讨论的前提是你的USB摄像头是UVC兼容的(如今大部分摄像头兼容)
默认Android不提供访问外部摄像头的API,所以你要考虑写一个内核到Android应用层通信的中间件。
当你给设备接入了USB摄像头,首先要检查一下几点:
1)你的设备是否支持USB-OTG?
2)是否在/dev目录创建了设备?如果创建了就那么一切就很简单了。shell 执行 ls -l /dev/v*,你将会看到video0或者video1。
3)如果/dev没有创建设备, 你需要写一个固件(UVC)跟硬件通信
(帖子地址: http://stackoverflow.com/questio  ... android-application)
读到这里,再次给我的MK802接上USB摄像头,然后打开adb shell,执行ls -l /dev/v*,看到了 /dev/video0设备!
拔掉摄像头,再执行,video0消失,再连接,video0出现,这说明mk802支持我的摄像头!

到此,已经明确,下一步我需要写一个android应用层到内核通信的中间件,我对这个也不了解,于是在google狂搜“android usb camera”
终于功夫不负有心,找到了一个android usb摄像头的应用例子
http://brain.cc.kogakuin.ac.jp/research/usb-e.html
从中找了一个SimpleWebCamra.apk,下载了赶紧装上,发现不能运行,logcat报一个错,提示没有权限访问video0设备。
这是为什么?我的系统已经root了呀!难道我的apk也要获得root权限?又在网上查资料,试了半天,还是不行。
后来忽然灵机一动,android也是linux呀,我能不能把video0设备设置成没权限?问了问朋友,执行了一个命令:
chmod 777 /dev/video0 
再次运行apk终于跑起来了!(后来经测试,设置成 chmod 0666 /dev/vidoe0 也可以,但是我也不懂0666的含义。。)
但是问题又来了,程序进去以后,报错
VIDIOC_DQBUF error 22, Invalid argument

于是想,必须要活的SimpleWebCamea的源码了!经过苦苦搜索,很幸运的找到一个simplewebcam的源码:
https://bitbucket.org/neuralassembly/simplewebcam/src
下载一看,里边包含ndk的c源码和android源码,于是按照ndk教程,安装了cygwin
苦于c代码看不太懂,错误提示VIDIOC_DQBUF 调用参数错误,却无从下手。
于是看了n篇教程,偶然发现说打开摄像头设备的open方法的一些参数,然后试着把c代码中的一些参数去掉:
fd = open (dev_name, O_RDWR | O_NONBLOCK, 0);
改为
fd = open (dev_name, O_RDWR);
再次build,运行,天啊终于出来了,高兴死了!

终于搞定android驱动USB摄像头了!(zz) - 电视台不让放的 - 0911 

下边附上项目的源码:
  SimpleWebCam.zip (273.74 KB, 下载次数: 1492) 
### ESP32-S3 驱动 USB 摄像头的方法 ESP32-S3 支持通过 USB 接口连接外设,但由于其硬件资源有限,在处理 USB 摄像头时存在一些挑战。对于带有双 Type-C USB 的开发板,如 Goouuu ESP32-S3 N16R8,可以尝试使用特定库来实现 USB 摄像头的支持。 #### 使用 Arduino IDE 开发环境配置 为了使 ESP32-S3 能够识别并操作 USB 摄像头,需安装必要的库文件和支持包: - 安装 `USB Host` 库以支持 USB 设备枚举和控制功能[^1]。 - 添加 `UVC (USB Video Class)` 库以便解析视频流数据。 ```cpp #include <USBHost_t36.h> #include <UVC.h> // 创建 UVC 对象实例 USBHost usb; UVC uvc(&usb); ``` #### 初始化与设备检测 初始化过程中要确保正确挂载 USB 主机栈,并扫描可用的 USB 摄像头设备: ```cpp void setup() { Serial.begin(115200); // 启动 USB 主机模式 if (!usb.Init()) { while (1); // 如果初始化失败则进入死循环 } delay(1000); // 给 USB 设备时间完成启动过程 // 尝试打开第一个找到的摄像头 if (!uvc.begin()) { Serial.println("Failed to open camera"); while (1); } } ``` #### 获取图像帧 一旦成功连接到摄像头,就可以按照所需分辨率设置参数,并定期抓取最新一帧的画面作为 JPEG 编码后的字节数组返回给应用程序逻辑层进一步处理: ```cpp void loop() { static uint32_t lastFrameTime = millis(); // 控制采集频率不超过每秒一定次数 if ((millis() - lastFrameTime) >= FRAME_INTERVAL_MS) { lastFrameTime += FRAME_INTERVAL_MS; // 请求下一帧图片 if (uvc.get_frame()) { const size_t frameSize = uvc.frame_size(); // 处理接收到的数据... // 打印调试信息显示当前帧大小 Serial.printf("Captured %zu bytes\n", frameSize); } else { Serial.println("Failed to capture frame."); } } } ``` 需要注意的是,由于 ESP32-S3 内存相对较小,当涉及到高分辨率实时预览或录制时可能会遇到性能瓶颈。因此建议优化代码效率的同时考虑降低画质要求或者采用外部存储方案辅助缓存大量多媒体资料。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值