转载请标明出处:https://blog.csdn.net/u013752202/article/details/96502576
简介
网络摄像头,即常说的免驱摄像头,其采用UVC协议通过USB跟主机通信,因其不需要编写单独的驱动,方便使用而得到广泛使用。
主机端无论是windows还是linux使用UVC摄像头都非常简单,也有很多文章详细介绍使用方法。但如何使自己的设备变成一个网络摄像头,却鲜有文章提及,本文重点分析如何构建一台网络摄像头。
硬件和软件基础
硬件:一套带有MIPI/DVP摄像头模组和USB接口的嵌入式主板
软件:系统linux,MIPI/DVP驱动是通的(本文不做介绍)
系统结构
网络摄像头涉及到两套linux驱动框架,V4L2视频采集框架,USB驱动框架。两套框架在linux系统中已经非常成熟,我们只需要会配置和应用就可以搭建出一个网络摄像头了。网络摄像头的系统结构如图1所示。
图1 网络摄像头系统结构
驱动配置
网络摄像头系统结构分为两部分,即驱动和应用。
驱动又分为视频采集驱动和视频输出驱动,如果只想从文件中读取视频然后通过USB传输到电脑上观看的话,那么视频采集驱动不是必需的。
视频采集驱动的功能是通过i2c配置CMOS模组的寄存器并采集图像数据,如果有需要编码的话,还负责编码数据。该驱动需要根据CMOS寄存器实现一个v4l2的子设备即可。具体目录为:drivers/media/i2c/soc_camera
视频输出驱动配置
在linux中已经实现了webcam的虚拟摄像头驱动,只要配置打开即可。这里有两种配置方法,linux原生驱动和Android usb驱动。这里先介绍linux原生驱动。
图2 linux原生webcam驱动配置
执行make menuconfig,按照图2 webcam配置即可。配置完成后编译kernel。源码目录位于:drivers/usb/gadget
应用编写
根据图1结构图,网络摄像头需要一个应用程序uvc_gadget来从视频输入设备或者文件中获取视频流,然后通过视频输出设备向电脑或其他USB主机输出视频。
视频输入设备的打开、配置和读取跟平常一样操作,分为Open->format setting->request buffer(mmap) ->stream on->read frame->stream off。设备缓存类型配置为:V4L2_BUF_TYPE_VIDEO_CAPTURE
视频输出设备会复杂一点,需要根据UVC建立连接的过程来配置和打开设备,UVC的事件包括:CONNECT/DISCONNECT/SETUP/DATA/STREAMON/STREAMOFF。
其中虚拟摄像头的配置需要在STREAMON的时候配置,STREAMOFF的时候关闭,否则只能打开一次摄像头,重新打开只能重新插拔USB了。设备缓存类型配置为:V4L2_BUF_TYPE_VIDEO_OUTPUT
可以用select()监控视频输出设备的事件状态和写状态,当可写时候,即可把视频输入设备读取到的视频流填充到输出设备的缓存中,这样电脑上就能看到画面了。
网络摄像头源码:待发布……(可与作者联系)
转载请标明出处:https://blog.csdn.net/u013752202/article/details/96502576
版权说明:如非注明,本站文章均为 扬州驻场服务-网络设备调试-监控维修-南京泽同信息科技有限公司 原创,转载请注明出处和附带本文链接。
请在这里放置你的在线分享代码