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\n"
);
        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二进制文件

【ARM-Linux开发】TI AM437x调试WEB CAM的更多相关文章

  1. 在Ubuntu上建立Arm Linux 开发环境

    我使用的是友善2410的板子,以前都是用Fedora,现在家里的电脑被我转为Linux专用的了,装的是Ubuntu.但是嵌入式还是要玩的,在装载过程中也遇到一些小麻烦.在此记录一下,一来自己比较健忘, ...

  2. 成功移植SQLite3到ARM Linux开发板

    SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了 ...

  3. minigui移植到arm linux开发板上无法执行

    要保证目录下有该文件 /etc/MiniGUI.cfg 复制过程使用cp –af 强制复制

  4. 应聘linux/ARM嵌入式开发岗位

    **************************************************************** 因为发在中华英才和智联招聘没有人采我所以我 在这里发布我的个人简历希望 ...

  5. 【DSP开发】【Linux开发】基于ARM+DSP进行应用开发

    针对当前应用的复杂性,SOC芯片更好能能满足应用和媒体的需求,集成众多接口,用ARM做为应用处理器进行多样化的应用开发和用户界面和接口,利用DSP进行算法加速,特别是媒体的编解码算法加速,既能够保持算 ...

  6. VS2015配置Linux开发远程调试

    # VS2015配置Linux开发远程调试 ### 简介-----------------------------vs2015支持跨平台开发 ### 软件环境--------------------- ...

  7. Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核

    Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核 标签(空格分隔): Qemu ARM Linux 在上文<Qemu搭建ARM vexpress开发环 ...

  8. 【Qt开发】【VS开发】【Linux开发】OpenCV、Qt-MinGw、Qt-msvc、VS2010、VS2015、Ubuntu Linux、ARM Linux中几个特别容易混淆的内容

    [Qt开发][VS开发][Linux开发]OpenCV.Qt-MinGw.Qt-msvc.VS2010.VS2015.Ubuntu Linux.ARM Linux中几个特别容易混淆的内容 标签:[Qt ...

  9. 构建 ARM Linux 4.7.3 嵌入式开发环境 —— BusyBox 构建 RootFS

    上一篇我们已经成功将 ARM Linux 4.7.3 的内核利用 U-BOOT 引导了起来.但是细心的你会发现,引导到后面,系统无法启动,出现内核恐慌 (Kernel Panic). 原因是找不到文件 ...

随机推荐

  1. Spark mllib 随机森林算法的简单应用(附代码)

    此前用自己实现的随机森林算法,应用在titanic生还者预测的数据集上.事实上,有很多开源的算法包供我们使用.无论是本地的机器学习算法包sklearn 还是分布式的spark mllib,都是非常不错 ...

  2. Java直接内存读写的例子

    在Hotspot JVM上,我们能够直接对内存进行读写操作.该类的allocateMemory方法用于申请分配内存,putAddress和getAddress方法用于对直接内存进行读写. 本文将通过s ...

  3. PostgreSQL、Greenplum 日常监控 和 维护任务

    背景 Greenplum的日常监控点.评判标准,日常维护任务. 展示图层 由于一台主机可能跑多个实例,建议分层展示. 另外,即使是ON ECS虚拟机(一个虚拟机一个实例一对一的形态)的产品形态,实际上 ...

  4. selenium鼠标下滑操作

    # coding = utf-8 import time from selenium import webdriver from selenium.webdriver.common.by import ...

  5. stdu1309(不老的传说)

    题目链接:http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/1309.html 不老的传说问题 Ti ...

  6. 关于JAVA线程池-ThreadPoolExecutor

    1. 源码翻译 /* * * * * * * Written by Doug Lea with assistance from members of JCP JSR-166 * Expert Grou ...

  7. Java--常用API介绍

    Scanner类--键盘输入,室友起来三个步骤: 第一,导包:import java.util.Scanner 第二,创建:Scanner sc = new Scanner(System.in) 第三 ...

  8. oracle查询表指定字段类型

    查询表某字段类型,如下: SELECT data_type FROM all_tab_cols WHERE table_name = UPPER('SRIS_P_BaseInfo') and colu ...

  9. jQuery之编写插件

    一.学习插件编写背景 作为一名前端人员,应该注重前端复用性及组件化,更应该考虑前端的性能优化,做到代码简洁有序,不冗余.特别是在大型团队中,如果一个团队中存在多个功能相似的组件,举个栗子,拿分页组件举 ...

  10. 使用多个tomcat如何修改端口号

    一.找到tomcat下conf文件夹下server.xml: 二.修改8080端口 三.修改8009端口 四.修改8005端口 修改后同时启动多个tomcat成功.