转载请标明出处: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

Logo

更多推荐