目录

一、视频流原理与移植

二、mjpeg-streamer视频图像的显示

2.1 MJPG简介

2.2环境

2.3查看我的摄像头信息

2.4驱动移植过程

2.5mjpg-stream的移植

(1)jpeg库的移植

(2)、移植mjpg-streamer


一、视频流原理与移植

视频就是告诉切换的图像,当他一秒钟闪过超过15张图片就会形成视频,一般电影是24,这个专业术语叫帧数(FPS)。

嵌入式有个专门的方向就是处理视频和声音的处理

首先随便买个USB接口的摄像头,通过A9的驱动传给JPEG图像库,在通过mjpeg-streamer视频流服务器传给网页。

二、mjpeg-streamer视频图像的显示

2.1 MJPG简介

MJPG是MJPEG的缩写,但是MJPEG还可以表示文件格式扩展名.

MJPEG全名为 "Motion Joint Photographic Experts Group",是一种视频编码格式,

Motion JPEG技术常用与闭合电路的电视摄像机的模拟视频信号“翻译”成视频流,并存储在硬盘上。典型的应用如数字视频记录器等。MJPEG不像MPEG,不使用帧间编码,因此用一个非线性编辑器就很容易编辑。

MJPEG的压缩算法与MPEG一脉相承,功能很强大,能发送高质图片,生成完全动画视频等。

但相应地,MJPEG对带宽的要求也很高,相当于T-1,MJPEG信息是存储在数字媒体中的庞然大物,需要大量的存储空间以满足如今多数用户的需求。

因此从另一个角度说,在某些条件下,MJPEG也许是效率最低的编码/解码器之一。

MJPEG 是 24-bit 的 "true-color" 影像标准,MJPEG 的工作是将 RGB 格式的影像转换成 YCrCB 格式,目的是为了减少档案大小,

一般约可减少 1/3 ~ 1/2 左右。

  MJPEG与MJPG的区别:

  1、mjpeg是视频,就是由系列jpg图片组成的视频。

  2、MJPG是MJPEG的缩写,但是MJPEG还可以表示文件格式扩展名.

2.2环境

主机环境:ubuntu 12.04.4 LTS

目标机:Cortex-A9

主机工具链:gcc-4.6.4

交叉工具链:arm-none-linux-gnueabi-

摄像头:xxx

2.3查看我的摄像头信息        

1 )确定 USB 摄像头支持 UVC (在 PC 上)

那什么 USB 摄像头适合我们这一章的教程呢,这里有几个关键字: 1.支持
UVC(免驱), 2.YUV 或者 MJPEG 格式输出。

2) 把摄像头插入 PC 机的 USB 接口,查看 ID

注:如果你是在 Ubuntu 等 linux操作系统下请看 1~2,在 windows 下请直接看看 3 。1. 在 linux 类操作系统下插入 USB 摄像头,用 dmesg 打印信息

#dmesg

[127598.091966] usb 1-1: new high-speed USB device number 29 using ehci-pci

[127598.519721] usb 1-1: New USB device found, idVendor=057e, idProduct=030a

[127598.519728] usb 1-1: New USB device strings: Mfr=48, Product=96, SerialNumber=0

[127598.519731] usb 1-1: Product: USB Camera

[127598.519733] usb 1-1: Manufacturer: Guillemot Corporation

[127598.560887] uvcvideo: Found UVC 1.00 device USB Camera (057e:030a)

[127598.574918] input: USB Camera as /devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/input/input10

Found UVC 1.00 device USB Camera  也就是我们插入的 USB 摄像头他的 VID:PID 是057e:030a。

这里的 ID 号可以在下一步 UVC 官方的文档中进一步确定是否被支持。

如果将用 ls /dev/video* 查看设备节点

fengjunhui@ubuntu:~$ ls /dev/video0

/dev/video0

这里的 video0 是是我们刚接入的 USB 摄像头。

3) 在 windows 操作系统下插入 USB 摄像头插入,打开设备管理器

第一个 USB2.0 Camera 是我们接入的 USB 摄像头,第二个 USB2.0 UVCPC Camera 是笔记本自带的摄像头。

右键属性 -> 详细信息 –> 属性 选择硬件 ID 查看
可以得到插入的 USB 摄像头 VID:PID 为 057e: 030a。 这里的 ID 号可以在下一步 UVC 官方的文档中进一步确定是否被支持。

(现在的摄像头说是免驱其实是因为他使用的通用型驱动)

4) 确定 USB 摄像头种类

通过这个文档《摄像头驱动VID+PID 大全》 来确定芯片类型,这个文件在附带的文件夹下;通过这个网页 http://www.ideasonboard.org/uvc/ 来查看是否支持 UVC,这个网站是 USB Video Class Linux device driver 的主页,里面有 UVC 的详细的介绍。根据前面的打印信息,根据自己的 ID 号, WEBEE 这里是搜索 USB 摄像头的 VID 号: 1e4e 和 PID 号: 0110。

通过摄像头的 ID,可以看到该摄像头是否支持 UVC 和其他信息。绿勾代表支持,成功的看到,我们的摄像头不支持,哈哈哈。

5)安装并使用 xawtv 测试 (Ubuntu 下)

1. 安装 xawtv 测试软件
#sudo apt-get install xawtv

2. 执行 xawtv 后面带 usb 摄像头的设备节点
#xawtv   /dev/video0

或者:(推荐)

2)使用应用程序茄子(cheese
    输入命令:sudo apt-get install cheese
    装好后,终端输入命令:

cheese

,即可打开。

如果接入虚拟机在这设置

 插上拔出dmesg可以查看

2.4驱动移植过程

1,添加驱动支持USB储存设备。

1. 进入 USB support(需要让USB设备正常工作,串口设备正常工作)

添加驱动支持USB储存设备。

(根据《系统移植实验手册-V2.pdf》在我们的设备树中添加USB的设备信息) ==== 关键步骤

进入内核目录:cd  linux-3.14
#make menuconfig

Device Drivers  --->

[*] USB support  --->

<*>     EHCI HCD (USB 2.0) support

<*>     EHCI support for Samsung S5P/EXYNOS SoC Series

<*>     USB Mass Storage support

<*>   USB3503 HSIC to USB20 Driver

USB Physical Layer drivers  --->

<*> Samsung USB 2.0 PHY controller Driver

SCSI device support  --->

<*> SCSI device support

<*> SCSI disk support

2. 选中 Multimedia support
Device Drivers --->
      <*> Multimedia support --->

如图配置:

再进入 Media USB Adapters

Device Drivers --->
    <*> Multimedia support --->
         <*>Media USB Adapters --->

如图配置

4. 进入 GSPCA base webcams

Device Drivers --->
   <*> Multimedia support --->
        <*>Media USB Adapters --->
            <*>GSPCA base webcams

如图配置

5. 进入 V4L platform devices
Device Drivers --->

<*> Multimedia support --->

<*>V4L platform devices --->

如图配置

6. 编译内核
#make uImage

重新拷贝到我们的tftp目录下。

usbphy: usbphy@125B0000 {
    #address-cells = <1>;
    #size-cells = <1>;
    compatible = "samsung,exynos4x12-usb2phy";
    reg = <0x125B0000 0x100>;
    ranges;
    clocks = <&clock 2>, <&clock 305>;
    clock-names = "xusbxti", "otg";
    usbphy-sys {
        reg = <0x10020704 0x8 0x1001021c 0x4>;
    };
};
ehci@12580000 {
    status = "okay";
    usbphy = <&usbphy>;
};
usb3503@08 {
    compatible = "smsc,usb3503";
    reg = <0x08 0x4>;
    connect-gpios = <&gpm3 3 1>;
    intn-gpios = <&gpx2 3 1>;
    reset-gpios = <&gpm2 4 1>;
    initial-mode = <1>;
};

在设备树中添加usb信息

 

 

 

 

make uImage

make dtbs

cp arch/arm/boot/dts/exynos4412-fs4412.dtb ~/tftpboot/

cp arch/arm/boot/uImage  ~/tftpboot/

2.5mjpg-stream的移植

关于mjpg-stream的资料大家可以在下面这个网址查看:http://sourceforge.net/apps/mediawiki/mjpg-streamer/index.php?title=Main_Page

source code的网址是:http://mjpg-streamer.svn.sourceforge.net/viewvc/mjpg-streamer/

mjpg-stream的移植需要jpeg的库,所以我们先移植jpeg的库

(1)jpeg库的移植

1)jpeg源码包通过下面这个网址下载

http://www.ijg.org/files/jpegsrc.v8b.tar.gz

2)解压源码包

tar xvf jpegsrc.v8b.tar.gz

3)配置源码

cd jpeg-8b

./configure --prefix=/home/fengjunhui/securitymonitor/mjpeg-streamer/video/jpegarm  --host=arm-none-linux-gnueabi

(注意:--prefix表示最终生成的库和头文件等存放的目录,自己指定一个存在的路径就可以,

后面编译mjpeg-streamer的时候回用到,此处必须使用绝对路径,--host=arm-none-linux-gnueabi  --host表示生成的库的运行平台,注意是两个 -  ,末尾不能加- ,./configure 之后为一行命令)

比如我的路径: pwd

/home/fengjunhui/securitymonitor/mjpeg-streamer/video/jpegarm

(这个目录建议自己创建一个在mjpeg-streamer的上一级目录下)

4)编译

make

5)安装

make install

6)拷贝库到文件系统中

sudo cp /home/fengjunhui/securitymonitor/mjpeg streamer/video/jpegarm/lib/* /home/fengjunhui/source/rootfs/lib

./configure --prefix=/home/book/nfs_rootfs/mjpg-streamer/video/jpegarm/ --host=arm-none-linux-gnueabi
make

make install

(2)、移植mjpg-streamer

1、下载源码,在https://sourceforge.net/projects/mjpg-streamer/下载的源码(mjpg-streamer-code-182) 最新的版本使用以下命令下载,

svn cohttps://mjpg-streamer.svn.sourceforge.NET/svnroot/mjpg-streamermjpg-streamer

解压,并进入目录一共有 这么多目录

doc mjpg-streamer udp_client

mjpeg-client mjpg-streamer-experimental uvc-streamer

mjpg-streamer :目录下提供了 的执行程序和各个输入输出设备组件

uvc-streamer   : 目录下提供了 uvc-streamer的可执行目录

mjpeg-client: : 分别有 linux和windows 的客户端

2、进入其目录

cd    /home/mjpg/mjpg-streamer-code-182/mjpg-streamer

3、修改源码

修改

vi   ./plugins/input_uvc/Makfile,

修改

CFLAGS += -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC

CFLAGS += -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC -I /home/fengjunhui/securitymonitor/mjpeg-streamer/video/jpegarm/include

修改

(CC)(CFLAGS) -o @inputuvc.cv4l2uvc.lojpegutils.lodynctrl.lo(LFLAGS)

为 (注意还是一行,不要直接复制粘贴,根据实际情况思考来做)

(CC)(CFLAGS) -L /home/fengjunhui/securitymonitor/mjpeg-streamer/video/jpegarm/lib –o @inputuvc.cv4l2uvc.lojpegutils.lodynctrl.lo(LFLAGS)

注:/home/fengjunhui/securitymonitor/mjpeg-streamer/video/jpegarm/lib就是上面移植jpeg库后生成的lib、include的目录的路径,千万不要写错了

4、在mjpg-streamer-code-182/mjpg-streamer 目录下

编译:make CC=arm-linux-gcc

在mjpg-streamer生成了

input*.so output*.so 和 mjpg_streamr 可执行文件

小问题:

make CC=arm-linux-gcc

make: svnversion: Command not found

解决方案:sudo apt-get install subversion

安装之前先更新一下软件包的源和依赖:

Sudo apt-get update              更新软件源

Sudo apt-get -f   install         更新依赖

再次编译:

make

Nothing to be done for `all'.

make clean,

然后再

make CC=arm-linux-gcc

查看生成的库和可执行的文件:

fengjunhui@ubuntu:~/securitymonitor/mjpeg-streamer/mjpg-streamer-code-182/mjpg-streamer$ ls *.so

input_file.so         input_uvc.so    output_http.so

input_testpicture.so  output_file.so  output_udp.so

ls mjpg_streamer

mjpg_streamer

5、在开发板建立mjpg-streamer安装目录 (关键性的拷贝过程)

mkdir    /home/fengjunhui/source/rootfs/mjpg-streamer (你的根文件系统目录)

cp   *.so    /home/fengjunhui/source/rootfs/mjpg-streamer  -arf

cp   mjpg_streamer  /home/fengjunhui/source/rootfs/mjpg-streamer  -arf

将源码目录中的start.sh和目录www拷贝到~/source/rootfs/mjpg-streamer/目录下,然后就可以测试啦

sudo   cp start.sh   www/    ~/source/rootfs/mjpg-streamer/ -arf

  1. 测试:

./start.sh   (记得插上摄像头设备喔)

MJPEG格式错误,

ERROR opening V4L interface: No such file or directory

Init v4L2 failed !! exit fatal

i: init_VideoIn failed

MJPG-streamer [1296]: init_VideoIn failed

解决方案:

  1. 插上USB摄像头,查看设备节点:  ls   /dev/video0
  2. 如果没有设备节点,则参考《ttyUSB0设备节点不显示的解决方案.doc》

视频流格式错误:

cannot be displayed because it contains errors

修改start.sh文件,加参数-y,然后运行start.sh;

./mjpg_streamer -i “./input_uvc.so -y” -o “./output_http.so -w ./www”

在PC机打开一个网页,输入http://192.168.1.100:8080/?action=stream就可以看到图像。 (板子ip)

以上是mjpg-streamer的移植全过程,下面说说在这过程可能出现的错误以及解决方法。

1、当编译mjpg-stream-r63时出错

[root@wu mjpg-stream-r63]# make CC=arm-linux-gcc

arm-linux-gcc -O3 -DLINUX -D_GNU_SOURCE -Wall -c -o mjpg_streamer.o mjpg_streamer.c

mjpg_streamer.c:27:28: fatal error: linux/videodev.h: No such file or directory

compilation terminated.

make: * [mjpg_streamer.o] 错误 1

原因:这是因为内核2.6.38和以后的版本已经移除了对 v4l1 的支持,这个东西可能比较老旧了。新的头文件是 video4linux2.h;相比v4l1很多接口都变化 。

解决办法:可以选择以前低版本内核,或者用新版本的mjpg-streamer-code-182,下载地址在上面有链接。

3、使用摄像头出现如下信息

………………..

Init v4L2 failed !! exit fatal

init_VideoIn failed

………………..

原因:市面上大部分摄像头都是支持YUV的,而不是JPEG的。

解决方法:由于mjpg-stream支持JPEG和YUV两种格式,所以只需修改start.sh,在输入中加入 ” - y “

假如原来是./mjpg_streamer -i “./input_uvc.so ” -o “./output_http.so -w ./www”,则改为

./mjpg_streamer -i “./input_uvc.so -y” -o “./output_http.so -w ./www”即可。

总结:经过一轮的谷歌+百度后终于可以在firefox看了摄像头采集的图像

4、缺少库的支持

root@makeru :/mjpg-streamer# ./start.sh 
MJPG-streamer [1308]: starting application
MJPG Streamer Version: svn rev: 
MJPG-streamer [1308]: MJPG Streamer Version: svn rev:

ERROR: could not find input plugin
MJPG-streamer [1308]: ERROR: could not find input plugin

Perhaps you want to adjust the search path with:
MJPG-streamer [1308]:        Perhaps you want to adjust the search path with:

# export LD_LIBRARY_PATH=/path/to/plugin/folder
MJPG-streamer [1308]:        # export LD_LIBRARY_PATH=/path/to/plugin/folder

dlopen: libjpeg.so.8: cannot open shared object file: No such file or directory
MJPG-streamer [1308]:        dlopen: libjpeg.so.8: cannot open shared object file: No such file or directory

忘记拷贝库(这里需要保证你拷贝的库是ARM格式的    file  libjpeg.so.8 )

cp /home/fengjunhui/securitymonitor/mjpeg-streamer/video/jpegarm/lib/ /home/fengjunhui/source/rootfs/lib

cd  mjpg-streamer-code-182/mjpg-streamer

cp  *.so  /home/fengjunhui/source/rootfs/mjpg-streamer  -arf

cp mjpg-stream /home/fengjunhui/source/rootfs/mjpg-streamer  -arf

将源码目录中的start.sh和目录www拷贝到~/source/rootfs/mjpg-streamer/目录下,然后就可以测试啦

sudo cp start.sh www/ ~/source/rootfs/mjpg-streamer/ -arf

7、获得帮助

获得帮助的方法在start.sh里有说明,以下举一个例子,运行./mjpg_streamer –help它会打印出以下帮助,可根据需要设置参数

The following parameters can be passed to this plugin:

[-d | –device ]…….: video device to open (your camera)

[-r | –resolution ]…: the resolution of the video device,

can be one of the following strings

QSIF QCIF CGA QVGA CIF VGA

SVGA XGA SXGA

or a custom value like the following

example: 640x480

[-f | –fps ]……….: frames per second

[-y | –yuv ]……….: enable YUYV format and disable MJPEG mode

[-q | –quality ]……: JPEG compression quality in percent

(activates YUYV format, disables MJPEG)

[-m | –minimum_size ].: drop frames smaller then this limit, useful

if the webcam produces small-sized garbage frames

may happen under low light conditions

[-n | –no_dynctrl ]…: do not initalize dynctrls of Linux-UVC driver

[-l | –led ]……….: switch the LED “on”, “off”, let it “blink” or leave

it up to the driver using the value “auto”

 在开发板中加上这些,这样在启动时就会自动启动视频流和boa服务器

嵌入式安防监控项目——安防监控实现相关推荐

  1. PPP模式与城市视频监控项目结合产效应

    对于PPP模式,人们已经不再陌生.这种公私合作的模式作为公关基础设施中新的项目融资方式,具有适应当前社会发展的必要性:一方面有助于公共服务融资创新,减轻当期财政压力,与各个供应商共同承担风险;另一方面 ...

  2. 19.12 添加自定义监控项目;19.13,19.14 配置邮件告警(上下);19.15 测试告警19.16...

    19.12 添加自定义监控项目 需求:监控某台web的80端口连接数,并出图 两步:1)zabbix监控中心创建监控项目: 2)针对该监控项目以图形展现 客户端hao2机器配置: 1. 客户端(hao ...

  3. 19.12 添加自定义监控项目 配置邮件告警 测试告警

    9月12日任务 19.12 添加自定义监控项目 19.13/19.14 配置邮件告警 19.15 测试告警 19.16 不发邮件的问题处理 19.12 添加自定义监控项目 需求:监控某台web的80端 ...

  4. 添加自定义监控项目,配置邮件告警,测试告警,不发邮件的问题处理

    2019独角兽企业重金招聘Python工程师标准>>> 添加自定义监控项目 需求:监控某台web的80端口连接数,并出图 两步:1)zabbix监控中心创建监控项目:2)针对该监控项 ...

  5. 告警系统主脚本 告警系统配置文件 告警系统监控项目

    一.告警系统主脚本 我们要养成习惯,把shell脚本放到/usr/local/sbin/目录下,方便我们查找 [root@linux-01 ~]# cd /usr/local/sbin/ [root@ ...

  6. 部署Zabbix监控平台,配置及使用Zabbix监控系统,自定义Zabbix监控项目

    案例1:常用系统监控命令 案例2:部署Zabbix监控平台 案例3:配置及使用Zabbix监控系统 案例4:自定义Zabbix监控项目 1 案例1:常用系统监控命令 1.1 问题 本案例要求熟悉查看L ...

  7. 添加自定义监控项目、配置邮件告警、测试告警、不发邮件的问题处理

    添加自定义监控项目 需求:监控某台web的80端口连接数,并出图. 步骤: 1) zabbix监控中心创建监控项目 2) 针对该监控项目以图形展现 被监控端: 1. [root@centos7-2 l ...

  8. java mail 监控新邮件,添加自定义监控项目,配置邮件告警,测试告警,不发送邮件的问题处理...

    笔记内容:19.12添加自定义监控项目 19.13/19.14配置邮件告警 19.15测试告警 19.16不发送邮件的问题处理 笔记日期:2017-11-20 19.12添加自定义监控项目 自定义的监 ...

  9. 【实战】物联网安防监控项目【4】———从网页上控制A9的LED灯

    前言 学习了一个新知识,当然要记录一下啦.这两天学习了boa服务器.cgic标准库和html标签语言,又双叕解锁一个嵌入式的新玩法.cgic库是沟通C语言和html网页编程语言的一座桥梁,通过在lin ...

最新文章

  1. 基于i2c子系统的驱动分析
  2. JavaScript常规语法小总节
  3. MySQL 打开federated存储引擎
  4. 教程 打造OS X Mavericks原版 EFI Clover 引导安装
  5. html HTML1300 进行了导航,jquery根据文章H标签自动生成导航目录
  6. yarn全局安装vue/cli vue不是内部命令
  7. python读取mysql数据库_Python操作MySQL数据库9个实用实例
  8. 竟然被awk生成的随机数给整蒙了,也谈随机数生成种子
  9. EasyUI笔记(六)数据表格
  10. G-Sensor 校准标准
  11. 关于新建android项目时 appcompat_v7报错问题的一点总结
  12. keil4 c语言标准,求助!关于KEIL4和C语言
  13. 皮克定理 poj2954
  14. The following packages have unmet dependencies问题
  15. android 蓝牙传输到苹果手机,使用蓝牙文件交换将文件从Android传输到Mac | MOS86
  16. 重庆大学计算机学院课题组,【计算机】计算机学院关于智能计算的大规模优化学术报告圆满结束...
  17. 从事计算机行业考MBA有用吗,什么行业需要考mba
  18. 数据库系统-存储过程
  19. 关于使用Pytorch时,训练集模型表现很好但测试集模型表现极差的原因
  20. C语言关键字 restrict(一)

热门文章

  1. Lims系统和ELN系统的功能和区别
  2. 欧康维视收购诺华制药两款眼科产品中国大陆地区所有权益;上海生物医药创新转化基金正式启动 | 医药健闻...
  3. 九州云与英特尔联合发布智慧校园私有云框架,赋能教育新基建
  4. 对php课程的建议和意见,对教学的意见和建议
  5. java特殊符号处理
  6. 敏捷宣言和敏捷的十二原则
  7. 华为企业路由器OSPF简单实例
  8. Python 仅下载B站视频的音频
  9. 深度学习最佳学习路径
  10. 乔岩航拍作品赏析:从格陵兰岛小镇到白马雪山