详解移植mjpg

    xiaoxiao2021-04-16  35

    介绍: Mjpg‐streamer是一个开源软件,用于从webcam摄像头采集图像,把它们以流的形式通过基于ip的网络传输到浏览器如Firefox,Cambozola,VLC播放器,Windows的移动设备或者其他拥有浏览器的移动设备. mjpg - streamer  可以通过文件或者是HTTP方式访问linux UVC兼容摄像头。 ————————————————————————————————————————————————— 本文作一个移植记录。 前天买了个优迈Q5 USB摄像头,准备用来做毕业设计,需要移植mjpg_streamer。昨天在移植的时候折腾了一下,现在已成功移植到九鼎x210板子(S5PV210)上,能够在ubuntu下的火狐浏览器打开摄像头采集画面,下面开始记录移植过程。 ————————————————————————————————————————————— 一、环境 主机环境:ubuntu14.04 目标机:九鼎创展科技的x210开发板(S5PV210) 主机工具链:gcc-4.8.2 交叉工具链:arm-none-linux-gnueabi-gcc-4.4.1 ( 用一个软连接“arm-linux-gcc”指向它,下面有参数会用到它) ____________________________________________________________________________________________________________ 二、移植过程  1、配置内核是内核支持UVC格式的摄像头 (其实默认支持UVC,它是标准协议), 最后一步时根据自己需要进行选择摄像头配置。

    Device Drivers  --->

                   <*> Multimedia support  --->

                             [*]   Video capture adapters  --->

                                    [*]   V4L USB devices  --->                                           <*>   USB Video Class (UVC)

                                              [*]     UVC input events device support        

    2、重新编译arm板的内核 ,烧录到板子,启动后 将USB摄像头插进板子串口有信息自动弹出时,即识别成功。 make -j2 3、mjpg-stream的移植  mjpg-stream的资料可以在下面这个网址查看(全英文): http://sourceforge.net/apps/mediawiki/mjpg-streamer/index.php?title=Main_Page   mjpg-stream最新版下载 网址是: http://mjpg-streamer.svn.sourceforge.net/viewvc/mjpg-streamer/  , (进去后,点右上的“Download Snapshot”下载最新版的 mjpg-streamer-code-182,因为旧版编译时会出现缺少一个头文件的错误) mjpg-stream的移植需要jpeg的库,所以我们先移植jpeg的库 ,即需要libjpeg 第一步:jpeg库的移植  1)jpeg源码包通过下面这个网址下载  http://www.ijg.org/files/jpegsrc.v8b.tar.gz   2)解压源码包  tar xvf jpegsrc.v8b.tar.gz  3)配置源码 ,下面的配置很重要,自行定义jpeg安装目录(得先创建那 文件夹), 并使用交叉工具链编译jpeg库(要不然会出现编译mjpg_streamer的input_uvc.o时找不到兼容的ljpeg错误!) cd jpeg-8b ,在命令行分别输入下面命令配置: ./configure --prefix= /usr/local/src/out_jpeg -host=arm-none-linux-gnueabi  ./configure CC=arm-linux-gcc --prefix= /usr/local/src/out_jpeg -host=arm-none-linux-gnueabi 4)编译  make  5)安装 ,执行 make install  命令后,在上面配置的 /usr/local/src/out_jpeg 文件夹中便出现了一些文件夹,包括bin、includelib、share,红色这两个文件夹便是mjpg_streamer需要的。 6)拷贝上面的lib文件夹即jpeg库到文件系统中  cp /usr/local/src/out_jpeg/ lib  /root/rootfs/rootfs/lib -rf ( /root/rootfs/rootfs 此目录为自己的文件系统目录,arm板是挂载ubuntu中此目录作为根文件系统的) 第二步、移植mjpg-streamer  1、将下载 最新版本的 源码 解压至 /usr/local/src/ ,目录 mjpg-streamer-code-182 里内容如下: doc  mjpg-streamer  udp_client  mjpeg-client mjpg-streamer-experimental  uvc-streamer  ————————部分说明: mjpg-streamer :目录下提供了 的执行程序和各个输入输出设备组件  uvc-streamer : 目录下提供了 uvc-streamer的可执行目录  mjpeg-client:: 分别有 linux和windows 的客户端  ———————— 2、进入目录  cd mjpg-streamer  3、(1)修改源码 顶层的Makefile及 plugins文件夹里面所有子层的Makefile中的CC参数为arm-linux-gcc,即将所有“ CC = gcc ”改为“ CC = arm-linux-gcc ”,哈哈,不得不花上几分钟去修改。 (2)进入 /plugins/input_uvc/Makfile ,  修改  CFLAGS += -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC  为  CFLAGS += -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC -I  /usr/local/src/out_jpeg /include  修改  (CC)(CFLAGS) -o @inputuvc.cv4l2uvc.lojpegutils.lodynctrl.lo(LFLAGS)  为  (CC)(CFLAGS) -L   /usr/local/src/out_jpeg /lib -o @inputuvc.cv4l2uvc.lojpegutils.lodynctrl.lo(LFLAGS)  (注:/usr/local/src/out_jpeg/lib 就是上面移植jpeg库后安装的目录,根据自己设置的目录来修改)  这样,mjpg_streamer就和jpeg库绑定了。 4、编译:make (make clean为清除编译)  在mjpg-streamer目录下生成了  input*.so、 output*.so 和 mjpg_streamer 可执行文件  5、在开发板挂载的ubuntu文件系统目录中(本人为/root/rootfs/rootfs)建立mjpg-streamer安装目录  mkdir  /root/rootfs/rootfs /mjpg-streamer  再将源码目录 mjpg-stream整个 拷贝到 /root/rootfs/rootfs /mjpg-streamer目录下,然后就可以 测试 啦  cp mjpg-stream  /root/rootfs/rootfs /mjpg-streamer -rf 6、测试 (启动arm板,板子应设置好环境变量,让arm板通过tftp下载内核和挂载好ubuntu中的自制作文件系统) 启动后,插进USB摄像头,进入板子的 mjpg-streamer  目录, 执行 ./start.sh 若没有出现错误,则在PC机打开一个网页,输入 http://192.168.1.20:8080/?action=stream 就可以看到图像。  (ip为arm板的ip) ————————————————移植完毕———————————————————————— 若出现下面错误: Unable to set format: Invalid argument  Init v4L2 failed !! exit fatal  i: init_VideoIn failed

    错误原因: 市面上大部分摄像头都是支持YUV的,而不是JPEG的。mjpg-stream支持JPEG和YUV两种格式。

    解决方法:

    [fire@fire mjpg-streamer]$ cd mjpg-streamer/plugins/input_uvc/ [fire@fire input_uvc]$ vi 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; if(pthread_mutex_init(&cams[id].controls_mutex, NULL) != 0) { IPRINT("could not initialize mutex variable\n"); exit(EXIT_FAILURE); } .......................

    将上面红色代码改为:format = V4L2_PIX_FMT_YUYV

    以上就设置了默认的图像格式,重新在顶层把模块编译,再次cp mjpg-stream /root/rootfs/rootfs/mjpg-streamer -rf ,arm板重启后就成功了!

    转载请注明原文地址: https://ju.6miu.com/read-671999.html

    最新回复(0)