参考链接:https://blog.csdn.net/mucheni/article/details/109447610
前期准备:
PC端:Ubuntu18.04, 野火imx6ull pro开发板,免驱USB摄像头,需要用到交叉编译器
大致流程:
1.将jpeg库在PC端使用交叉编译,编译生成的文件,为后面编译Mjpg-Streamer做准备。
2.在PC端交叉编译Mjpg-Streamer,将生成的文件拷贝到开发板。
MJPG 库下载地址:
http://www.ijg.org/files/,这里我使用的是jpegsrc.v8b.tar.gz
在当前用户的家目录下创建一个mjpg文件夹:
mkdir mjpg
进入刚创建的mjpg目录,将下载好的jpegsrc.v8b.tar.gz压缩包放到mjpg目录,使用下面命令解压
tar -zxvf jpegsrc.v8b.tar.gz
接着在mjpg目录下创建mjpg_install目录,后面编译生成的文件放在次目录。
进入 jpeg-8b 文件夹,执行以下命令配置编译选项:
./configure --prefix=/home/cwz/mjpg/mjpg_install --host=arm-linux-gnueabihf
参数说明:
–-prefix=/home/cwz/mjpg/mjpg_install:指定安装的路径要使用绝对路径,这里根据自己的路径自行调整。
–-host=arm-linux-gnueabihf:将来软件要运行所在主机的架构。
make install
然后进入mjpeg_install(安装目录) 文件夹下查看,以下lib和include目录的路径会在后面用到。
将mjpeg_install 目录下的lib目录下的库文件拷贝到开发板的/lib/目录下:
我这里PC端和开发板用NFS将PC端上的 /home/workdir/ 挂载到开发板 /mnt/ 目录。所以使用下面将库文件拷贝到开发板。
PC端:
sudo cp *jpeg* /home/workdir/
开发板:
这里先查看下有没有将库文件全部拷贝到开发板的/mnt/目录下
sudo cp /mnt/*jpeg* /lib/
mjpg-streamer 是一个命令行应用程序,可通过网络将 JPEG 文件从网络摄像头流传输到各种类型的查看器,例如浏览器,mplayer 等其他能够接收 MJPG 流的软件。
下载链接接:https://sourceforge.net/p/mjpg-streamer/code/HEAD/tree/
下载命令:
svn checkout https://svn.code.sf.net/p/mjpg-streamer/code/ mjpg-streamer-code
如果执行以上命令提示如下,
则说明需要先安装软件,输入以下命令安装
sudo apt install subversion
安装完成后,再执行上面的下载命令,等待下载命令执行结束,可以看到mjpg-streamer-code文件夹
进入mjpg-streamer-code/mjpg-streamer/ ,执行 以下命令
make clean
进入到mjpg-streamer-code/mjpg-streamer/plugins/input_uvc目录,修改Makefile。
vim Makefile
添加以下内容,是上面移植mjpg库时安装目录下生成的include目录和lib目录,根据之前设置的路径自行调整。
返回到mjpg-streamer目录下,执行make命令前,要设置交叉编译器,可以使用下面任一种种方法设置:
make CC=arm-linux-gnueabihf-gcc
出现错误,如下,这里我只记得提示的是未找到convert命令,下图不是当时出错具体信息,大概是这个意思。
解决:
这里是因为Makefile里面使用的convert命令识别不了,安装以下软件,就可以了。
sudo apt install graphicsmagick-imagemagick-compat
sudo apt install imagemagick-6.q16
sudo apt install imagemagick-6.q16hdri
安装好上面的软件,编译前先执行下面命令清除掉之前编译的,
make clean
再使用以下命令重新编译。
make CC=arm-linux-gnueabihf-gcc
从上图可以看到Makefile文件里的CC = gcc,这里要更改下。输入以下命令:
find -name "Makefile" -exec sed -i "s/CC = gcc/CC = arm-linux-gnueabihf-gcc/g" {} \;
这行命令是搜索当前目录及其子目录下的所有Makefile文件,并将Makefile里的CC变量设置为arm-linux-gnueabihf-gcc,因为Makefile默认是编译的软件运行在x86平台的。这里要移植到开发板,所以要更改使用交叉编译。
查看是否修改成功
grep "arm-linux-gnueabihf-gcc" * -nR
回到 mjpg-streamer 目录下,执行 make 编译,
make
编译成功后在目录下会生成:
.so 库文件:移植到/lib,提供动态库
mjpg_streamer:移植到/bin,提供可执行命令
www:移植到/opt,摄像头输出的网页
PC端:
sudo cp *.so start.sh mjpg_streamer /home/workdir/
sudo cp www /home/workdir/ -rdf
开发板端:
通过NFS,可以看到文件已经从PC端拷贝到开发板/mnt/目录下了。
接下来分别将文件拷贝到开发板的其他目录下。
sudo cp /mnt/*.so /lib/
sudo cp /mnt/mjpg_streamer /bin/
sudo cp /mnt/www /opt/ -rdf
执行完上面的步骤,就完成全部移植了。
在开发板上运行以下命令测试
mjpg_streamer --help
巴拉巴拉输出一堆内容
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-73qfG6Dq-1671632838994)(https://raw.githubusercontent.com/colorful-p/Image_Data_Structures/main/image-20221221120516306.png)]
说明成功移植到开发板上。
这个命令我不知道干嘛的,执行之后报了一堆错。不管了。
mjpg_streamer -i "input_uvc.so -d /dev/video0" -o "output_http.so"
input_uvc.so -d:打开设备节点 /dev/video1
output_http.so:输出信息通过http发送出去
输入以下命令运行mjpg_streamer
mjpg_streamer -i "input_uvc.so -d /dev/video0 -f 30 -q 90 -n" -o "output_http.so -w /opt/www"
执行命令,出现以下错误,我这里是因为开发板(imx6ull pro)未安装v4l-utils工具
sudo apt install v4l-utils
再次进输入上面mjpg_streamer的命令,成功运行如下:
注意:当Ctrl + z,中断进程的时候,再次运行mjpg_streamer,会出现错误,需要先kill这个进程,方可重新运行。
开发板运行mjpg_streamer成功后,在PC端打开浏览器:输入开发板的IP地址和8080端口号,点击Stream选项会出现图像。