本帖最后由 dql2016 于 2021-11-20 16:03 编辑
0、mjpg-streamer介绍
mjpg-streamer是一款免费基于IP地址的视频流服务器,它的输入插件从摄像头读取视频数据,这个输入插件产生视频数据并将视频数据复制到内存中,它有多个输出插件将这些视频数据经过处理,其中最重要的输出插件是网站服务器插件,它将视频数据传送到用户浏览器中,mjpg-streamer的工作就是将其中的一个输入插件和多个输出插件绑定在一起,所有的工作都是通过它的各个插件完成的。mjpg-streamer各个文件如下:
(1)input_testpicture.so。这是一个图像测试插件,它将预设好的图像编译成一个头文件,可以在没有摄像头的情况下传输图像,从而方便调试程序。
(2)input_uvc.so。此文件调用USB摄像头驱动程序V4L2,从摄像头读取视频数据。
(3)input_control.so。这个文件实现对摄像头转动的控制接口。
(4)output_http.so。这是一个功能齐全的网站服务器,它不仅可以从单一文件夹中处理文件,还可以执行一定的命令,它可以从输入插件中处理一幅图像,也可以将输入插件的视频文件根据现有M-JPEG标准以HTTP视频数据服务流形式输出。
(5)output_file.so。这个插件的功能是将输入插件的JPEG图像存储到特定的文件夹下,它可以用来抓取图像。
mjpg-streamer优点是对RAM和CPU的消耗比较少,可以快速的传输jpeg流。
一、米尔SDK安装
在终端执行命令:
- . /opt/st/myir/3.1-snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
将设置好交叉编译工具链,常用的环境变量如CC。
二、libjpeg交叉编译
有些UVC摄像头只支持输出YUV原始图像,此时mjpg-streamer会将其转码为mjpeg,然后进行传输,此时会对CPU的消耗以及实时流的流畅度有影响,特别是分辨率比较大的时候。
因此mjpg-streamer 依赖 libjpeg, libjpeg下载地址:
http://www.ijg.org/
目前最新版本是v9d。libjpeg交叉编译命令:
- make clean
- . /opt/st/myir/3.1-snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
- ./configure --host=arm-ostl-linux-musl --prefix=$HOME/stm32mp1/build_jpegsrc.v9d
- make -j6
- make install
写成编译脚本:
编译成功后得到动态库:
米尔MYD-YA15XC-T内核已经配置好了UVC和USB 驱动,因此无需重新配置编译内核。
三、mjpg-streamer交叉编译
mjpeg-streamer下载
https://sourceforge.net/p/mjpg-streamer/code/HEAD/tree/
目前最新版本为r182,本次测试使用版本r63。
在ubuntu可通过2种命令下载代码:
- 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
在编译前需要对源码的Makefile做以下修改:
将源码的所有Makefile(包含其子目录)中的编译工具链修改为米尔开发板的编译工具链,由于在终端执行命令. /opt/st/myir/3.1-snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi会设置好交叉编译相关的环境变量,因此去掉Makefile文件中的CC 即可。
本次测试只需要 input_uvc.so 和 output_http.so,在主目录中的Makefile里面只选择这两个,其它的去掉。
插件input_uvc依赖jpeg,因此修改plugins/input_uvc/Makefile文件,指定jpeg库头文件路径:
- CFLAGS += -I$HOME/stm32mp1/build_jpegsrc.v9d/include
指定链接jpeg动态库路径:
- -ljpeg -L$HOME/stm32mp1/build_jpegsrc.v9d/lib
编译成功之后,在lib目录会生成如下输入、输出动态库文件:
在mjpg-streamer-r63目录生成mjpg-streamer可执行文件:
查看一下mjpg-streamer文件信息,ARM 32位可执行程序:
将上面生成的动态库文件都复制到lib目录:
然后将lib目录里面的文件和mjpg-streamer可执行文件一起打包为app_and_lib.tar.xz,使用SCP命令将它复制到开发板home目录:
解压:
得到如下文件,使用
chmod +x mjpg-streamer命令为mjpg-streamer添加可执行权限:
四、测试
插入USB UVC摄像头,正确识别到了视频设备:
手动指定一下库路径:
- export LD_LIBRARY_PATH=./
执行下列命令启动mjpg-streamer:
- ./mjpg_streamer -i "input_uvc.so -r 1920x1080" -o "output_http.so -w ./www"
如果是输出YUV格式的UVC摄像头,则执行命令:
- ./mjpg_streamer -i "input_uvc.so -y -r 1920x1080" -o "output_http.so -w ./www
查看图片,在浏览器输入:
http://192.168.1.136:8080/?action=snapshot
查看视频,在浏览器输入:
http://192.168.1.136:8080/?action=stream
其中192.168.1.136为开发板IP地址。
视频和抓拍效果如下:
附录:
MJPG简介:MJPEG全名为 "Motion Joint Photographic Experts Group",是一种视频编码格式,Motion JPEG技术常用与闭合电路的电视摄像机的模拟视频信号“翻译”成视频流,并存储在硬盘上。典型的应用如数字视频记录器等。MJPEG不像MPEG,不使用帧间编码,因此用一个非线性编辑器就很容易编辑。MJPEG的压缩算法与MPEG一脉相承,功能很强大,能发送高质图片,生成完全动画视频等;从另一个角度说,在某些条件下,MJPEG也许是效率最低的编码/解码器之一。MJPEG与MJPG的区别:mjpeg是视频,就是由系列jpg图片组成的视频。
还有一款MJPG视频流服务开源软件uStreamer:
µStreamer is a lightweight and very quick server to stream MJPG video from any V4L2 device to the net.
https://github.com/pikvm/ustreamer