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_streamparm
----------------------
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