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还可以表示文件格式扩展名.
主机环境:ubuntu 16.04.4 LTS
目标机:Cortex-A53
主机工具链:gcc-4.5.1
交叉工具链:arm-none-linux-gnueabi-
摄像头:ZC301
14. 1 确定 USB 摄像头支持 UVC (在 PC 上)
那什么 USB 摄像头适合我们这一章的教程呢,这里有几个关键字: 1.支持
UVC(免驱), 2.YUV 或者 MJPEG 格式输出。
14.1.1 把摄像头插入 PC 机的 USB 接口,查看 ID
注:如果你是在 Ubuntu 等 linux操作系统下请看 1~2,在 windows 下请直接看看 3 。1. 在 linux 类操作系统下插入 USB 摄像头,用 dmesg 打印信息
#dmesg
[134691.269053] usb 1-1: new high-speed USB device number 31 using ehci-pci
[134691.707363] usb 1-1: New USB device found, idVendor=057e, idProduct=030a
[134691.707365] usb 1-1: New USB device strings: Mfr=48, Product=96, SerialNumber=0
[134691.707366] usb 1-1: Product: USB Camera
[134691.707367] usb 1-1: Manufacturer: Guillemot Corporation
[134691.946909] media: Linux media interface: v0.10
[134691.999556] Linux video capture interface: v2.00
[134692.282438] uvcvideo: Found UVC 1.00 device USB Camera (057e:030a)
[134692.324103] uvcvideo 1-1:1.0: Entity type for entity Extension 4 was not initialized!
[134692.324105] uvcvideo 1-1:1.0: Entity type for entity Processing 3 was not initialized!
[134692.324106] uvcvideo 1-1:1.0: Entity type for entity Camera 1 was not initialized!
[134692.325089] input: USB Camera as /devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/input/input6
[134692.326955] usbcore: registered new interface driver uvcvideo
[134692.326957] USB Video Class driver (1.1.1)
Found UVC 1.00 device USB Camera 也就是我们插入的 USB 摄像头他的 VID:PID 是057e:030a。这里的 ID 号可以在下一步 UVC 官方的文档中进一步确定是否被支持。
linux@ubuntu:~/kernel/linux-3.4.39$ ls /dev/vide*
/dev/video0
这里的 video0 是是我们刚接入的 USB 摄像头。
3. 在 windows 操作系统下插入 USB 摄像头插入,打开设备管理器
第一个 USB2.0 Camera 是我们接入的 USB 摄像头,第二个 USB2.0 UVCPC Camera 是笔记本自带的摄像头。
右键属性 -> 详细信息 –> 属性 选择硬件 ID 查看
可以得到插入的 USB 摄像头 VID:PID 为 057e: 030a。 这里的 ID 号可以在下一步 UVC 官方的文档中进一步确定是否被支持。
14. 1.2 确定 USB 摄像头种类
通过这个文档《摄像头驱动VID+PID 大全》 来确定芯片类型,这个文件在附带的文件夹下;通过这个网页 http://www.ideasonboard.org/uvc/ 来查看是否支持 UVC,这个网站是 USB Video Class Linux device driver 的主页,里面有 UVC 的详细的介绍。根据前面的打印信息,根据自己的 ID 号, WEBEE 这里是搜索 USB 摄像头的 VID 号: 1e4e 和 PID 号: 0102。
通过摄像头的 ID,可以看到该摄像头是否支持 UVC 和其他信息。绿勾代表支持,成功的看到,我们的摄像头不支持,哈哈哈。
14.1.3 安装并使用 xawtv 测试你的摄像头 (Ubuntu 下)
1. 安装 xawtv 测试软件
#sudo apt-get install xawtv
2. 执行 xawtv 后面带 usb 摄像头的设备节点
#xawtv /dev/videoX
这里我将两种摄像头的移植都放上去,
#make menuconfig
1,添加驱动支持USB储存设备。
1. 进入 USB support
添加驱动支持USB储存设备。
(根据系统移植手册在我们的设备树中添加USB的设备信息)
Device Drivers --->
[*] USB support --->
<*> EHCI HCD (USB 2.0) support
<*> USB Mass Storage support
SCSI device support --->
<*> SCSI device support
<*> SCSI disk support
2. 选中 Multimedia support
Device Drivers --->
<*> Multimedia support --->
如图配置
如上图:在Video capture adapters下
4. 进入 GSPCA base webcams
Device Drivers --->
<*> Multimedia support --->
<*>Media USB Adapters --->
<*>GSPCA base webcams
(在最下面选中ZC3XX)
<*> ZC3XX USB Camera Driver
Device Drivers --->
<*> Multimedia support --->
<*>V4L platform devices --->
如图配置
6. 编译内核
#make uImage -j4
重新拷贝到我们的共享目录下。
关于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
当前的目录:
linux@ubuntu:~/security-monitor/mjpg-streamer$ pwd
/home/linux/security-monitor/mjpg-streamer
mkdir video/jpegarm -p
cd jpeg-8b
./configure --prefix=/home/linux/security-monitor/mjpg-streamer/video/jpegarm --host=arm-none-linux-gnueabi
(注意:此处必须使用绝对路径, –-prefix为两个 -,--host=arm-none-linux-gnueabi 末尾不能加-
源码的安装一般由3个步骤组成:配置(configure)、编译(make)、安装(make install),作为扩展:自己去了解一下--prefix的含义)
4)编译
make
5)安装
make install
执行这个命令之后,查看你的~/security-monitor/mjpg-streamer/video/jpegarm
linux@ubuntu:~/security-monitor/mjpg-streamer/video/jpegarm$ ls
bin include lib share
6)拷贝库到你的网络文件系统中
sudo cp /home/linux/security-monitor/mjpg-streamer/video/jpegarm/lib/* /home/linux/source/rootfs/lib -arf
(注意是lib目录下的库文件拷贝到网络文件系统的库文件下)
(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 的客户端
Pwd查看当前文件所在的目录:
/home/linux/security-monitor/mjpg-streamer/mjpg-streamer-code-182
cd 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/linux/security-monitor/mjpg-streamer/video/jpegarm/include
修改
(CC)(CFLAGS) -o @inputuvc.cv4l2uvc.lojpegutils.lodynctrl.lo(LFLAGS)
为
(CC)(CFLAGS) -L /home/linux/security-monitor/mjpg-streamer/video/jpegarm/lib -o @inputuvc.cv4l2uvc.lojpegutils.lodynctrl.lo(LFLAGS)
注: /home/linux/security-monitor/mjpg-streamer/video/jpegarm/lib就是上面移植jpeg库后生成的lib、include的目录 ,
4、在mjpg-streamer-code-182/mjpg-streamer 目录下
编译:make CC=arm-none-linux-gnueabi-gcc
在mjpg-streamer生成了
input*.so output*.so 和 mjpg_streamr 可执行文件
linux@ubuntu:~/smartstorage/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
可能存在的问题:
linux@ubuntu:~/security-monitor/mjpg-streamer/mjpg-streamer-code-182/mjpg-streamer$ make CC=arm-linux-gcc
make: svnversion: Command not found
arm-linux-gcc -D'SVN_REV=""' -O2 -DLINUX -D_GNU_SOURCE -Wall -c -o mjpg_streamer.o mjpg_streamer.c
make: arm-linux-gcc: Command not found
make: *** [mjpg_streamer.o] Error 127
因为你的电脑中缺少必要的库的问题,你需要安装必要的软件集:
sudo apt-get install subversion libv4l-dev libjpeg62-dev imagemagick
5、在你的网络文件系统目录下建立mjpg-streamer安装目录
mkdir /home/linux/source/rootfs/mjpg-streamer (你的根文件系统目录)
(拷贝库文件和mjpg_streamer可执行文件到指定的目录)
sudo cp *.so /home/linux/source/rootfs/mjpg-streamer -arf
sudo cp mjpg_streamer /home/linux/source/rootfs/mjpg-streamer -arf
(注意要加参数 -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
修改start.sh文件,然后运行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-none-linux-gnueabi-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
忘记拷贝库,将jpeg的库拷贝到网络文件系统的指定目录下:
sudo cp /home/linux/security-monitor/mjpg-streamer/video/jpegarm/lib/* /home/linux/source/rootfs/lib -arf
cd mjpg-streamer-code-182/mjpg-streamer
sudo cp *.so ~/source/rootfs/lib/ -arf
sudo cp *.so /home/linux/source/rootfs/mjpg-streamer/ -arf
cp mjpg_streamer /home/linux/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”