嵌入式安防监控项目 |
您所在的位置:网站首页 › a9摄像头软件 › 嵌入式安防监控项目 |
目录 一、视频流原理与移植 二、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 ,即可打开。 如果接入虚拟机在这设置
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 = ; #size-cells = ; compatible = "samsung,exynos4x12-usb2phy"; reg = ; ranges; clocks = , ; clock-names = "xusbxti", "otg"; usbphy-sys { reg = ; }; }; ehci@12580000 { status = "okay"; usbphy = ; }; usb3503@08 { compatible = "smsc,usb3503"; reg = ; connect-gpios = ; intn-gpios = ; reset-gpios = ; initial-mode = ; }; 在设备树中添加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 测试:./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 解决方案: 插上USB摄像头,查看设备节点: ls /dev/video0如果没有设备节点,则参考《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”
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |