zoukankan      html  css  js  c++  java
  • 【ARM-Linux开发】TI AM437x调试WEB CAM

    Rico Board是基于TI AM437x的一款小型学习板,提供的丰富的接口以及资源,能够实现很多有趣的idea,从本周起,开始总共四期的实验教程,帮助玩家们快速上手Rico Board在嵌入式上面的应用。
    Lab 1 是使用Rico Board实现网络摄像头的应用。

    前言

    这里我们采用的方案是使用USB摄像头采集图像,然后通过网络在电脑的浏览器或客户端上显示。如果要实现这么一个应用,软件由这么几个部分组成,首先需要的是内核对USB的驱动,然后是采集,视频传输服务程序,如果使用客户端还需要电脑上的客户端程序。早在Linux Kernel版本2.4的时代,就有一个著名的SPCA5xx系列驱动,它是的起因是由一个法国医生由于在Linux上面找不到USB摄像头的驱动而自己开发的一个项目,之后这个项目支持的摄像头越来越多,如今该驱动已经被继承进了Linux Kernel主分支中,项目也施法最终版后关闭完结,但大家仍然可以访问http://mxhaard.free.fr/来下载改项目的源代码。关于这个法国医生的相关故事可以阅读这里
    但是如今内核版本已经发展到了3.1x,同时原来的V4L1也进化到了V4L2,因此改项目中包含的servfox和spcaview这对C/S结构的程序已经不能用了,当年的Jpeg、Mpeg编码也发展到了如今的H.264,H.265,另外现在还有更通用的UVC(USB Video Camera)架构的摄像头驱动标准,基于的软件也变为了UVC驱动+mjpg-streamer实现。当然内核版本是2.4或2.6的系统还是可以使用SPCA5xx+servfox+spcaview的软件来实现webcam应用的。

    开始移植


    UVC驱动

    配置内核编译选项
    1
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

    搜索找到UVC选项,选择UVC驱动
    Device Drivers  --->
             <*> Multimedia support  --->
               Media USB Adapters  --->
                             <*>   USB Video Class (UVC)
                                 UVC input events device support

    重新编译内核。
    至于其他USB摄像头驱动,SPCA5xx可以选择驱动,但由于之后使用的应用程序是V4L2,SPCA5xx接口是V4L1,所以就不再测试了。

    交叉编译mjpg-streamer

    下载r182版本的mjpg-streamer,(r63版本支持有问题)
    http://sourceforge.net/code-snapshots/svn/m/mj/mjpg-streamer/code/mjpg-streamer-code-182.zip
    1
    2
    3
    uzip mjpg-streamer-code-182.zip
    cd mjpg-streamer-code-182
    make CC=arm-linux-gnueabihf-gcc DESTDIR=/home/myir/targetNFS/ install

    交叉编译jpeg库

    RicoBoard默认安装Matrix Gui,文件系统上已经集成了jpeg库,可以忽略这部,如果使用的是其他文件系统,还需要编译jpeg库。
    下载jpeg库源码:http://www.ijg.org/files/jpegsrc.v9.tar.gz
    1
    2
    3
    4
    5
    tar -zxvf jpegsrc.v9.tar.gz
    cd jpegsrc-9a
    ./configure CC=arm-linux-gnueabihf-gcc --host=arm-unknown-linux --prefix=/home/myir/targetNFS/ --enable-shared --enable-static
    make
    make install

    修改mjpg-streamer包含v9版本库。
    1
    2
    3
    4
    5
    6
    vi mjpg-streamer-code-182/mjpg-streamer/plugins/input_uvc/Makfile
    -- CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall
    ++ CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -I/home/myir/jpeg-9/jpeg/include
     
    -- $(CC) $(CFLAGS) -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo $(LFLAGS)
    ++ $(CC) $(CFLAGS) -ljpeg -L/home/myir/targetNFS/lib -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo

    编译mjpeg-streamer
    1
    make CC=arm-linux-gnueabihf-gcc DESTDIR=/home/myir/targetNFS/ install

    实验结果

    将/home/myir/targetNFS/目录中编译生成的二进制文件,全部拷贝到目标开发板的根目录。也可以直接下载使用本文附件中提供的编译好的文件,将mjpg_streamer.tar.gz文件,拷贝进开发板文件系统,执行:
    1
    2
    tar zxvf mjpg_streamer.tar.gz
    cd mjpg_streamer

    将lib文件夹下三个库文件input_uvc.so,output_http.so,libjpeg.so.9拷贝到/lib目录下,将www整个目录拷贝到根目录下,
    然后在开发板命令行执行:
    1
    mjpg_streamer -i "/lib/input_uvc.so" -o "/lib/output_http.so -w /www"

    注意:
          1.如果是Matrix Gui文件系统,需要关闭Matrix或杀掉http进程,释放端口。
    1
    2
    /etc/init.d/matrix-gui-2.0 stop
    kill $(ps | grep "http" | awk '{print $1}')

          2.执行中,如果出现
    1
    2
    Unable to set format: 1196444237 res: 640x480
     Init v4L2 failed !! exit fatal
    错误,需要根据摄像头支持的格式,修改源文件,市面上大部分摄像头都是支持YUV的,而不是JPEG的
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    [fire@fire mjpg-streamer]$ cd mjpg-streamer/plugins/input_uvc/
    [fire@fire input_uvc]$ vim input_uvc.c
     
    int input_init(input_parameter *param, int id)
    {
        char *dev = "/dev/video0", *s;
        int width = 640, height = 480, fps = -1, format = V4L2_PIX_FMT_MJPEG , i;
     
        /* initialize the mutes variable */
        if(pthread_mutex_init(&cams[id].controls_mutex, NULL) != 0) {
            IPRINT("could not initialize mutex variable ");
            exit(EXIT_FAILURE);
        }
    ......................

    如果摄像头支持YUV的,修改format = V4L2_PIX_FMT_YUYV
    以上就设置了默认的图像格式,重新把模块编译,之后就成功了!
    在PC端打开浏览器,访问:http://<Rico Board IP>:8080/?action=stream,就可以看到流畅的视频流了
     



    mjpg_streamer.tar.gz

    498.38 KB, 下载次数: 1242

    包含编译好的库文件和可执行的mjpg_steamer二进制文件

  • 相关阅读:
    基于element-ui图片封装组件
    计算时间间隔具体每一天
    C语言学习笔记 —— 函数作为参数
    AtCoder Beginner Contest 049 题解
    AtCoder Beginner Contest 048 题解
    AtCoder Beginner Contest 047 题解
    AtCoder Beginner Contest 046 题解
    AtCoder Beginner Contest 045 题解
    AtCoder Beginner Contest 044 题解
    AtCoder Beginner Contest 043 题解
  • 原文地址:https://www.cnblogs.com/huty/p/8517447.html
Copyright © 2011-2022 走看看