mjpg-streamer是一个命令行应用程序,可将JPEG帧从一个或多个输入插件复制到多个输出插件。 它可用于通过基于IP的网络将JPEG文件从网络摄像头流式传输到各种类型的查看器,如Chrome,Firefox,Cambozola,VLC,mplayer和其他能够接收MJPG流的软件。
他的优点是对RAM和CPU的消耗比较少,可以快速的传输mjpeg流。
注意:有些UVC摄像头只支持输出YUV原始图像,此时mjpg-streamer会将其转码为mjpeg,然后进行传输,此时会对CPU的消耗以及实时流的流畅度有影响。特别是分辨率比较大的时候。
下载地址:
https://sourceforge.net/p/mjpg-streamer/code/HEAD/tree/
目前最新版本为r182
Linux下可通过SVN指令进行下载:
svn checkout svn://svn.code.sf.net/p/mjpg-streamer/code/ mjpg-streamer-code
svn checkout https://svn.code.sf.net/p/mjpg-streamer/code/ mjpg-streamer-code
另外,github上也有基于sourceforge上的源码做了一些修改,功能更多:
https://github.com/jacksonliam/mjpg-streamer
https://github.com/codewithpassion/mjpg-streamer
mjpg-streamer 依赖于 libjpeg,所以随后我们会编译安装libjpeg.
下载地址:
http://www.ijg.org/files/jpegsrc.v9b.tar.gz
使用如下指令进行编译:
# mkdir __install
# ./configure --prefix=$(pwd)/__install/ --host=arm-linux
#make
#make install
其中–host=arm-linux指定的是交叉编译工具链。
编译完成后,会在__install目录生成如下文件:
# ls __install/
bin include lib share
然后将__install/lib/libjpeg.so.9文件拷贝到设备lib目录即可
内核中需要确定是否打开了如下配置。
-> Device Drivers
<*> Multimedia support --->
<*> Video For Linux
[*] Enable VideoFor Linux API 1 (DEPRECATED) (NEW)
[*] Video capture adapters (NEW) --->
[*] V4L USB devices (NEW) --->
<*> USB Video Class (UVC)
Device Drivers --->
[*] USB support --->
{*} Support for Host-side USB
[*] USB device filesystem (DEPRECATED)
[*] USB device class-devices (DEPRECATED)
<*> OHCI HCD support
<*> USB Mass Storage support
[*] HID Devices --->
{*} Generic HID support
[*] /dev/hidraw raw HID device support
SCSI device support --->
<*> SCSI device support
[*] legacy /proc/scsi/ support
<*> SCSI disk support
<*> SCSI tape support
配置完成后,烧录编译即可
在编译前需要对源码的Makefile做以下修改:
①将源码的所有Makefile(包含其子目录)中的编译工具链修改为设备的编译工具链,例如:
CC = gcc 修改为
CC = arm-linux-gcc
②打开plugins/input_uvc/Makefile,大约14行左右
将
CFLAGS += -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC
修改为
CFLAGS += -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC -I/home/test_demo/mjpg_streamer/libjpeg/jpeg-9b/__install/include/
其中,-I/home/test_demo/mjpg_streamer/libjpeg/jpeg-9b/__install/include/为刚才编译的libjpeg生成的文件
③打开plugins/input_uvc/Makefile,大约33行左右
将
input_uvc.so: $(OTHER_HEADERS) input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo
$(CC) $(CFLAGS) -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo $(LFLAGS)
修改为
input_uvc.so: $(OTHER_HEADERS) input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo
$(CC) $(CFLAGS) -L/home/test_demo/mjpg_streamer/libjpeg/jpeg-9b/__install/lib/ -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo $(LFLAGS)
其中,-L/home/test_demo/mjpg_streamer/libjpeg/jpeg-9b/__install/lib/为刚才编译的libjpeg生成的文件
注意:如果只需要 input_uvc.so 和 output_http.so ,可以在主目录中的Makefile里面只选择这两个,其它的去掉即可,这样就不会主动编译PLUGINS目录下的其它文件
上面改写成功之后,使用如下命令进行编译:
#make
编译成功之后,会生成如下文件:
input_uvc.so output_http.so mjpg_streamer
将上面生成的文件拷贝到设备上,可以在设备上新建个目录,用于存放这些文件。
在设备上测试之前,需要确认有如下文件:
①libjpeg.so.9
②第5步生成的mjpg_streamer和*.so文件
③www目录及其全部文件(从源码中全部拷贝到设备上)
④插上UVC摄像头对应的设备文件,如 /dev/video0
使用如下命令运行mjpeg:
输出YUV格式的UVC摄像头:
# ./mjpg_streamer -i "./input_uvc.so -y" -o "./output_http.so -w ./www"
输出MJPEG格式的UVC摄像头:
# ./mjpg_streamer -i "./input_uvc.so " -o "./output_http.so -w ./www"
上面程序运行成功之后,可以通过有线或者无线,在手机或者电脑上,通过浏览器输入以下URL:
http://192.168.1.100:8080/?action=stream
即可看到实时流,192.168.1.100为设备的IP地址