mjpeg-streamer的使用记录

文章目录

  • 1 简介
  • 2 源码下载
    • 2.1 mjpeg-streamer下载
    • 2.2 libjpeg的下载
  • 3 依赖安装
    • 3.1 libjpeg的安装
  • 4 内核配置
    • 4.1 UVC驱动
    • 4.2 USB 驱动
  • 5 编译
  • 6 测试

1 简介

mjpg-streamer是一个命令行应用程序,可将JPEG帧从一个或多个输入插件复制到多个输出插件。 它可用于通过基于IP的网络将JPEG文件从网络摄像头流式传输到各种类型的查看器,如Chrome,Firefox,Cambozola,VLC,mplayer和其他能够接收MJPG流的软件。
他的优点是对RAM和CPU的消耗比较少,可以快速的传输mjpeg流。

注意:有些UVC摄像头只支持输出YUV原始图像,此时mjpg-streamer会将其转码为mjpeg,然后进行传输,此时会对CPU的消耗以及实时流的流畅度有影响。特别是分辨率比较大的时候。

2 源码下载

2.1 mjpeg-streamer下载

下载地址:
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

2.2 libjpeg的下载

mjpg-streamer 依赖于 libjpeg,所以随后我们会编译安装libjpeg.
下载地址:
http://www.ijg.org/files/jpegsrc.v9b.tar.gz

3 依赖安装

3.1 libjpeg的安装

使用如下指令进行编译:

# 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目录即可

4 内核配置

内核中需要确定是否打开了如下配置。

4.1 UVC驱动

-> 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)

4.2 USB 驱动

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

配置完成后,烧录编译即可

5 编译

在编译前需要对源码的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

将上面生成的文件拷贝到设备上,可以在设备上新建个目录,用于存放这些文件。

6 测试

在设备上测试之前,需要确认有如下文件:
①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地址

你可能感兴趣的:(音视频相关)