Android开发之《USB Camera》

时间:2021-10-18 14:55:17
SimpleWebCam Source Code:https://bitbucket.org/neuralassembly/simplewebcam/src

 

1. USB摄像头UVC兼容(如今大部分兼容)

2. 设备是否支持USB-OTG

3. 是够在/dev目录下创建了设备(shell执行ls -l /dev/v*,看到video0 video1)

4. 如果没有/dev设备,需要写一个固件(UVC)跟硬件通信

 

什么是UVC?

UVC,全称:USB video class或video device class,是Microsoft与另外几家设备厂商联合退出的为USB视频捕获设备定义的协议标准,目前已成为USB org标准之一。

主流操作系统 (如Windows XP SP2 and later, Linux 2.4.6 and later, MacOS 10.5 and later) 都已提供UVC设备驱动,符合UVC规格的硬件设备在不需要安装任何驱动程序下即可在主机中正常使用。

 

怎样判断一个摄像头是否属于UVC规范?

1. 使用lsusb命令,找出摄像头设备号(Vendor ID)和产品号(Product ID)

2. 查找是否有视频类接口信息

# lsusb -d VID: PID -v | grep "14 Video"

如果兼容,则会输出如下信息:

bFunctionClass 14 Video

bInterfaceClass 14 Video

bInterfaceClass 14 Video

bInterfaceClass 14 Video

否则,则是一个non-UVC设备

 

----------------------

 

camera控制主要参考v4l2接口 

v4l2 Camera详细设置

v4l2_streamparm

----------------------

C语言 select函数使用

fd_set readfd;  
struct timeval timeout;  
  
FD_ZERO(&readfd);   //初始化readfd  
FD_SET(gps_fd, &readfd);   //把gps_fd加入readfd  
timeout.tv_sec = 3;   //设置3秒超时  
timeout.tv_usec = 0;  
  
j = select(gps_fd+1, &readfd, NULL, NULL, &timeout);   //用select对gps_fd进行轮循  
if( j>0 ){  
    if( FD_ISSET(gps_fd, &readfd) ){   //如果gps_fd可读  
        i = read(gps_fd, buf, SIZE);  
        buf[i] = '\0';  
    }  
}  

YUV

640x480, 30 1280x720, 9 1920x1080, 6 MJPEG: 640x480, 61612 1280x720, 60 1920x1080, 30

MJPEG解码
可以参考这个文件frameworks/base/media/tests/omxjpegdecoder/jpeg_decoder_bench.cpp,这里面调用的libskia.so,libskia里调用的硬解码接口hw_jpeg_deco
 
 

 

在v4l2读出的帧中找到SOF0(Start Of Frame 0),插入个huffman表就可以用libjpeg解码成rgb。
可以参考mjpg-streamer中input_uvc目录下的代码,或者我刚调试好的 :https://github.com/joeshang/joycar/blob/master/module/v4l2_camera/decoder_mjpeg.c