UVC摄像头开发

Posted bobuddy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVC摄像头开发相关的知识,希望对你有一定的参考价值。

近期,要做一个usb摄像头的开发,然后看了韦东山老师的第三期视频,讲UVC协议摄像头开发的教程。做一些记录,以免忘记。

1当我们拿到一个摄像头,怎么知道它的一些信息呢?

(1)打开虚拟机,让它位于前台,插上摄像头,可以看到这样的界面。

然后连接,再在终端输入

#lsusb

就可以后到这么一句:

Bus 001 Device 003: ID 05a9:4519 OmniVision Technologies, Inc. Webcam Classic

可以看到,它是OmniVision公司的sensorVIP,PID分别为:05a9:4519
 再用   #dmesg   命令查看一下打印信息

 

2)我们从上面的内核打印信息可以看到,找到了uvc的设备,这是调用了内核的哪个文件的哪个函数呢?

  进入到内核目录:#cd /usr/src/linux-3.0/drivers/media/uvc

  搜索一下这条语句 :#grep "Found UVC"  * -nR

 找到它在uvc_driver.c中,可以知道,是调用了这里的程序。

(3) ls /dev/video*   可以看到它的设备节点

2那我们怎么知道它支持的格式及分辨率等信息呢?

1) #lsusb -h    查看试用方法

  #lsusb  -v -d  ox05a9:    //-d之后带的是厂家id,不要忘了冒号

就可以看到一大串打印出来的信息。下面我们就通过打印出的信息分析一下这个摄像头。

(2)device descriptor

[html]  view plain  copy
  1. Device Descriptor:  
  2.   bLength                18  
  3.   bDescriptorType         1  
  4.   bcdUSB               2.00  
  5.   bDeviceClass          239 Miscellaneous Device  
  6.   bDeviceSubClass         2 ?  
  7.   bDeviceProtocol         1 Interface Association  
  8.   bMaxPacketSize0        64  
  9.   idVendor           0x05a9 OmniVision Technologies, Inc.  
  10.   idProduct          0x4519 Webcam Classic  
  11.   bcdDevice            1.00  
  12.   iManufacturer           1   
  13.   iProduct                2   
  14.   iSerial                 0   
  15.   bNumConfigurations      1  
只有一个设备描述符。在 USB_Video_Example 1.5.pdf 找到它的说明。

里面的每一项都有对应。

(3)configuration descriptor

[html]  view plain  copy
  1. Configuration Descriptor:  
  2.    bLength                 9  
  3.    bDescriptorType         2  
  4.    wTotalLength          481  
  5.    bNumInterfaces          2  
  6.    bConfigurationValue     1  
  7.    iConfiguration          0   
  8.    bmAttributes         0x80  
  9.      (Bus Powered)  
  10.    MaxPower              128mA  
只有一个配置描述符。

(4)Interface Association

[html]  view plain  copy
  1. Interface Association:  
  2.       bLength                 8  
  3.       bDescriptorType        11  
  4.       bFirstInterface         0  
  5.       bInterfaceCount         2  
  6.       bFunctionClass         14 Video  
  7.       bFunctionSubClass       3 Video Interface Collection  
  8.       bFunctionProtocol       0   
  9.       iFunction               2   
接口联合体描述符,这里也只有一个。 usb 摄像头有 , 一个或多个 videostreaming interface. 那到底有多少个视频流接口呢?第一个是谁?就在这个 IAD I/F 中。


(5)Interface Descriptor:

[html]  view plain  copy
  1. Interface Descriptor:  
  2.       bLength                 9  
  3.       bDescriptorType         4  
  4.       bInterfaceNumber        0  
  5.       bAlternateSetting       0  
  6.       bNumEndpoints           1  
  7.       bInterfaceClass        14 Video  
  8.       bInterfaceSubClass      1 Video Control  
  9.       bInterfaceProtocol      0   
  10.       iInterface              2   
可以看到,有两个Interface Descriptor,旗下各有N个VideoControl Interface Descriptor和VideoStreaming Interface Descriptor。

(6)VideoControl Interface Descriptor:

[html]  view plain  copy
  1. VideoControl Interface Descriptor:  
  2.    bLength                13  
  3.    bDescriptorType        36  
  4.    bDescriptorSubtype      1 (HEADER)  
  5.    bcdUVC               1.00  
  6.    wTotalLength           79  
  7.    dwClockFrequency       30.000000MHz  
  8.    bInCollection           1  
  9.    baInterfaceNr( 0)       1  
  10.  VideoControl Interface Descriptor:  
  11.    bLength                18  
  12.    bDescriptorType        36  
  13.    bDescriptorSubtype      2 (INPUT_TERMINAL)  
  14.    bTerminalID             1  
  15.    wTerminalType      0x0201 Camera Sensor  
  16.    bAssocTerminal          0  
  17.    iTerminal               0   
  18.    wObjectiveFocalLengthMin      0  
  19.    wObjectiveFocalLengthMax      0  
  20.    wOcularFocalLength            0  
  21.    bControlSize                  3  
  22.    bmControls           0x0000000a  
  23.      Auto-Exposure Mode  
  24.      Exposure Time (Absolute)  
可以看到,它有多个VideoControl Interface Descriptor, 总共有多少个呢

 很明显,最多有7个不同的vc接口描述符,分别是输入端点、输出端点、摄像头端点、选择单元、处理单元、编码单元、扩展单元
  怎么看它属于哪类描述符呢?

  从上面可以看出,有一个元素是 bDescriptorSubtype      2 (INPUT_TERMINAL) ,就是这个子类来描述的。

 那这些子类的值又是什么含义,怎么确定呢?

在文档中搜索后面的VC_INPUT_TERMINAL,可以找到 vc 接口描述符所包含的子类。

  根据不同的子类,可以找到不同的说明与上面打印的信息对应,例如这个INPUT_TERMINAL,它的各位对应同下:


描述符长度是13个字节;

bDescriptorType        36  就说是接口类型,它的取值如下:


然后是输入端点子类;端点ID是1;端点类型为Camera Sensor;

(7) VideoStreaming Interface Descriptor
vs接口也有很多子类,它们的值为:

1、FORMAT_UNCOMPRESSED

[html]  view plain  copy
  1. VideoStreaming Interface Descriptor:  
  2. bLength                            27  
  3. bDescriptorType                    36  
  4. bDescriptorSubtype                  4 (FORMAT_UNCOMPRESSED)  
  5. bFormatIndex                        1  
  6. bNumFrameDescriptors                5  
  7. guidFormat                            59555932-0000-1000-8000-00aa00389b71  
  8. bBitsPerPixel                      16  
  9. bDefaultFrameIndex                  1  
  10. bAspectRatioX                       0  
  11. bAspectRatioY                       0  
  12. 以上是关于UVC摄像头开发的主要内容,如果未能解决你的问题,请参考以下文章

    UVC摄像头开发

    mipi camera 接在笔记本哪里

    UVCAndroid,安卓UVC相机通用开发库(支持多预览和多摄像头)

    Android平台GB28181接入端如何对接UVC摄像头?

    Android平台GB28181接入端如何对接UVC摄像头?

    uvc是啥