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. 通过自定义属性获取指定checkbox是否选中

    $("input[conferid='"+conferid+"']").is(':checked'); $("input[conferid='1234 ...

  2. Oracle 11g 禁用 SQL Tuning Advisor 与 auto space advisor

    生产上有一套11g数据库alert.log报错ORA-16957: SQL Analyze time limit interrupt.  查询MOS相关文档Troubleshooting: ORA-1 ...

  3. java文件上传下载组件

    需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...

  4. CF358D Dima and Hares dp

    状态的定义挺奇特的~ 发现最终每一个物品一定都会被选走. 令 $f[i][0/1]$ 表示 $a[i]$ 在 $a[i-1]$ 前/后选时 $1$~$(i-1)$ 的最优解. 因为一个数字的价值只由其 ...

  5. P1929 迷之阶梯

    题目描述 在经过地球防卫小队的数学家连续多日的工作后,外星人发的密码终于得以破解.它 告诉我们在地球某一处的古老遗迹中,存在有对抗这次灾难的秘密武器.防卫小队立即赶 到这处遗迹.要进入遗迹,需要通过一 ...

  6. P1449 后缀表达式

    题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级). 如:3*(5–2)+7对应 ...

  7. CNN模型合集 | 1 LeNet

    1.1 LeNet的设计思想 1998年LeCun提出,经典结构,3层,五脏俱全(卷积层.Pooling层.FC网络.Sigmod层),对标传统神经网络.主要设计贡献 局部感受野(local rece ...

  8. GO 包相关

    1 包编译,eg: 引用pkgtest包 pkgtest包没有任何编译,项目直接导入引用,项目编译时实际是会编译pkgtest并在pkg\windows_386下生成pkgtest.a文件 再编译项目 ...

  9. Synchronized 有几种用法

    我们都知道 Synchronized 是线程安全同步用的,大部分程序可能只会用到同步方法上面.其实 Synchronized 可以用到更多的场合,栈长列举了以下几个用法. 1.同步普通方法 这个也是我 ...

  10. 微信小程序:自定义导航栏

    在小程序开发的时候会遇到一些页面不需要头部导航,或像淘宝的商品详情一样自定义的导航栏.那先要清楚这导航可不能写死,每种手机的导航都各不相同. 一.在app.json的window对象中定义导航的样式: ...