技术标签: 网络 linux linux内核 express video 流媒体服务器 Linux Device Driver
本文所说的摄像头(Webcam),特指USB摄像头。
在Windows下,摄像头驱动由厂商开发并提供。但在Linux下,因商业利益有限 ,只有极少厂商愿意提供摄像头驱动支持。这并不妨碍Linux下摄像头的使用——广大第三方志愿者维护着大大小小的驱动。之前做过一个嵌入式皮毛项目,虽然摄像头驱动不关我的事,在好奇心驱使下简要探索了一番。结果是有些胸闷,它们像蜘蛛丝一样杂乱。写本文的动机是想理清一下主线,给后来者提供一点有限的参考,但无法保证下面的文字完全正确。
常见的摄像头驱动有以下几个系列: OVCam drivers(ov5xx)
该系列驱动是针对OmniVision OV5xx系列芯片,此类芯片被广泛运用于各种USB摄像头中,在嵌入式开发板上尤其常见。凡是使用了OV511/OV511+/OV518/OV6620/OV6630/OV7610/OV7620/OV7 620AE等图像传感器的摄像头都可以在该驱动下工作。
项目主页:http://alpha.dyndns.org/ov511/
Philips USB Webcam Driver(pwc) 该驱动主要用于Philips及pwc芯片兼容摄像头。由于原开发者与Philips公司签有保密协定,该驱动以二进制形式提供,后来被踢出内核,引起一场口水战:是用户需求重要还是保持内核纯洁重要?所幸后续开发者从原项目上创建了一个新的分支,使得该项目继续存活。
项目主页:http://www.saillard.org/linux/pwc/
QuickCam USB camera driver (qc-usb) 该驱动主要用于Logitech公司的QuickCam Express系列和其它兼容型号摄像头。最初由Georg Acher开发,当时命名为qce-ga。Jean-Frederic Clere参考该驱动创建出了第一个Video4Linux兼容驱动。从那开始,不断有开发者加入,使得该驱动逐渐能够支持新的摄像头和芯片。在此期间,该驱动更名为qc-usb,更为广泛地支持其它QuickCam USB摄像头,而不再是局限于Express系列。
项目主页:http://qce-ga.sourceforge.net/
QuickCam Messenger & Communicate driver(quickcam) 这是另一个针对QuickCam摄像头的驱动,它仅支持某一些型号,并且与qc-usb驱动不兼容。 项目主页:http://home.mag.cx/messenger/
SPCA webcam driver(gspca/spca5xx) 该系列驱动适用于Sunplus芯片摄像头,也适用于其它芯片,如目前国内山寨摄像头一哥“中星微”(Z-Star)芯片。Michel Xhaard是该项目的维护者,他在60岁左右的时候(大约是2003年)从一种普通常见的驱动入手,进而不断修改开发成一个支持250种以上摄像头的通用驱动。他还写了流媒体服务器spcaserv与客户端spcaview。不少高校所谓的嵌入式无线网络视频传输项目,就是从这两个东西来的。
项目主页:http://mxhaard.free.fr/spca5xx.html
Linux UVC driver(uvc) 该驱动适用于符合USB视频类(USB Video Class)规范的摄像头设备,它包括V4L2内核设备驱动和用户空间工具补丁。大多数大容量存储器设备(如优盘)都遵循USB规范,因而仅用一个单一驱动就可以操作它们。与此类似,UVC兼容外设只需要一个通用驱动即可。
USB摄像头大体上可以二分为UVC cameras和non-UVC cameras。推荐购买UVC cameras。UVC是一个开放的标准,拥有维护良好的驱动,它属于内核代码的一部分。插入摄像头后就可以工作,而无须编译或安装额外的驱动。non-UVC cameras通常情况下不比UVC cameras工作出色,前者的驱动并不遵循通用的协议,需要针对每种摄像头做出单独的处理,这往往需要一个逆向工程的探索过程。
判断一个摄像头是否属于UVC规范可以使用下面方法:
1.使用lsusb命令或其它硬件信息查看工具找出摄像头的设备号(Vendor ID)和产品号(Product ID)。如Logitech Quickcam for Notebooks Pro摄像头是046d:08cb;
2.查找是否有视频类接口信息
lsusb -d 046d:08cb -v | grep "14 Video"
如果该摄像头兼容UVC,则会输出类似信息
bFunctionClass 14 Video
bInterfaceClass 14 Video
bInterfaceClass 14 Video
bInterfaceClass 14 Video
若无以上信息,则是non-UVC设备。
项目主页:http://linux-uvc.berlios.de/
在Linux下摄像头驱动有三种存在形式,内置于内核(within the kernel),做为一个外挂的模块(module),或者是预编译的二进制程序(pre-compiled binary)。
Linux内核树会不断合并优秀的驱动。从2.4内核起,ov5xx驱动就已经是内核代码的一部分。从2.6.26开始,Linux内核原生包含uvc驱动。2.6.27内核又吸收进了gspca/spca5xx系列驱动。常见的Linux发行版所配置的内核,一般都已将这些驱动选项打开,而无需用户另外编译。内核的.config文件中有许多配置变量等式,用来说明内核配置的结果。y表示本编译选项对应的内核代码被静态编译进 Linux内核;m表示本编译选项对应的内核代码被编译成模块;n表示不选择此编译选项。
以Fedora12/boot下的config文件为例
cat /boot/config-2.6.31.12-174.2.3.fc12.i686 | grep CONFIG_USB_GSPCA
CONFIG_USB_GSPCA=m
CONFIG_USB_GSPCA_CONEX=m
CONFIG_USB_GSPCA_ETOMS=m
CONFIG_USB_GSPCA_FINEPIX=m
CONFIG_USB_GSPCA_MARS=m
CONFIG_USB_GSPCA_MR97310A=m
CONFIG_USB_GSPCA_OV519=m
CONFIG_USB_GSPCA_OV534=m
CONFIG_USB_GSPCA_PAC207=m
CONFIG_USB_GSPCA_PAC7311=m
CONFIG_USB_GSPCA_SN9C20X=m
CONFIG_USB_GSPCA_SN9C20X_EVDEV=y
CONFIG_USB_GSPCA_SONIXB=m
CONFIG_USB_GSPCA_SONIXJ=m
CONFIG_USB_GSPCA_SPCA500=m
CONFIG_USB_GSPCA_SPCA501=m
CONFIG_USB_GSPCA_SPCA505=m
CONFIG_USB_GSPCA_SPCA506=m
CONFIG_USB_GSPCA_SPCA508=m
CONFIG_USB_GSPCA_SPCA561=m
CONFIG_USB_GSPCA_SQ905=m
CONFIG_USB_GSPCA_SQ905C=m
CONFIG_USB_GSPCA_STK014=m
CONFIG_USB_GSPCA_SUNPLUS=m
CONFIG_USB_GSPCA_T613=m
CONFIG_USB_GSPCA_TV8532=m
CONFIG_USB_GSPCA_VC032X=m
CONFIG_USB_GSPCA_ZC3XX=m
可以看到gspca系列驱动被编译为模块。当插入摄像头后,使用dmesg命令可以打印出以下信息:
usb 1-1.2: new full speed USB device using ehci_hcd and address 6
usb 1-1.2: New USB device found, idVendor=046d, idProduct=08af
usb 1-1.2: New USB device strings: Mfr=0, Product=0, SerialNumber=0
usb 1-1.2: configuration #1 chosen from 1 choice
gspca: probing 046d:08af
zc3xx: probe 2wr ov vga 0x0000
zc3xx: probe sensor -> 0011
zc3xx: Find Sensor HV7131R(c)
gspca: probe ok
这说明该摄像头被识别,且自动挂载了gspca系列下的zc3xx驱动。
如果由于某种原因,已配置的内核中没有包括摄像头驱动,可以重新配置内核选项,用新编译的内核替换原有的旧内核。或者是依据设备号及产品号,直接到对应驱动的项目主页,下载源码进行编译。
最后总结一下
如果你想买一个摄像头,推荐买Logitech的,买符合UVC驱动的,可以到这里挑一款。
如果你已经有了一个摄像头,先插进去看看,Linux对它有没有反应。记录dmesg输出信息,记录lsusb输出设备号,以设备号为关键字上Google搜索。
参考资源 http://www.tldp.org/HOWTO/Webcam-HOWTO/
http://www.chineselinuxuniversity.net/courses/kern el/articles/19988.shtml
http://www.quickcamteam.net/
Function CopyAgilent(p) Dim fname As String Dim wb As Workbook Dim strCSV As String Dim xlApp As Object Dim XlBook As Excel.Workbook Dim arr Application.Scree.
方法一:需要用VM虚拟机打开虚拟机(VM)导入这个文件就行(左上角,文件打开)之后直接打开这个MS-DOS的虚拟机就OK了。ps如果你的VS是1.6的,那么就直接打开虚拟机就行,如果你的VS是1.5的,那么你需要在开启此虚拟机的下面有一个升级选项,升一下级再打开就行了(在上面帮助处看你的VS的版本)链接:https://pan.baidu.com/s/1IGdgDAf7Oyup0K-fMCMf4A提取码:ocf4方法二:不需要VM虚拟机下载好,打开DOSBoX-0.74并且点开滑到最后
安装gpu版pip install --upgradehttps://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-0.12.0-cp35-cp35m-win_amd64.whl安装CPU版本pip install --upgradehttps://storage.googleapis.com/tensor...
itoa()函数char *itoa( int value, char *string,int radix);原型说明:value:欲转换的数据。string:目标字符串的地址。radix:转换后的进制数,可以是10进制、16进制等。
Alice和Bob发明了一个新的旋转游戏。首先,Bob给定N个数组成的序列,并把该序列平均分配成若干个块,每块正好包含K个数(K能整除N)。第一块由第1到第K个数构成,第二块由第K+1个数到第2K个数构成,以此类推。 接着,Bob要求Alice对这个序列进行一系列操作,操作有以下两种: 1.把每块里面的数向左或右旋转X个位置; 2.把整个序列向左或向右旋转X个位置。 注意操作2会改变
类似于小米手机预约抢购,但这里预约是需要资格的,难点是高并发的处理。1.后台管理系统添加商品,字段包括sku、库存,抢购开始时间、抢购所需白条订单数,同时写入redis缓存2.前端系统直接从缓存查询展示商品及预约抢购信息3.订单累计系统接收消息累计用户订单数和金额,预约资格要用4.用户在前端系统预约商品,数据库记下预约记录,同时写入re...
/*解决iphone页面层级相互影响滑动的问题*/closeTouch:function(){document.getElementsByTagName("body")[0].addEventListener('touchmove',this.handler,{passive:false});//阻止默认事件},openTouch:function(){document.getElements...
一、spring框架概述spring是一个开源免费的框架,是基于java平台为了解决企业应用开发的复杂性而创建的。spring是各个功能是模块化的,所以你不使用的功能可以舍弃掉,只使用其中的部分功能。1、spring是一款轻量级的企业级框架,所以不需要你实现或继承spring中的接口和类,各个逻辑代码不依赖于spring框架本身,你可以只专注于本身本身,所以你可以很轻松的把spring分离...
2.文本输入组件11)问:如果要实现文本输入,在C++Builder中应该怎么办? 答:C++Builder常用文本输入组件来实现,常用的文本输入组件有Edit、MaskEdit 、Memo和RichEdit。他们的主要不同在于Edit和MaskEdit用于输入单行文本,而Memo和RichEdit可以输入多行文本。此外Label组件也可用来进行文本显示。 Edit和MaskEdit
什么是Java Server Pages?JSP全称Java Server Pages,是一种动态网页开发技术,使用JSP标签在HTML网页中插入Java代码,标签通常以<%开头以%>结束JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分,通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写J...
1、驱动主设备号手动分配驱动程序#include <linux/module.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/init.h>#include <linux/delay.h>#include <as...
用于复习链表,自己写的有关链表的一些操作,包括后插前插创建链表,删除,插入,有序合并,查找,遍历,反转,查中间节点,删倒数节点,检测环结构的功能。可以用做C语言实训参考。下面展示一些 内联代码片。#include<iostream>#include<stdio.h>using namespace std;//定义结构体typedef struct LNode{ int data; struct LNode *next;}LNode,*LinkList;