视频服务器移植
1.下载 jpeg 库,两个版本都可以
源码: http://www.ijg.org/files/jpegsrc.v8b.tar.gz v8 版本 源码: http://www.ijg.org/files/jpegsrc.v9f.tar.gz v9 版本
2. 配置 jpeg 源码,本教程以v9版本为例
tar -xvf [jpegsrc.v9f.tar.gz](http://www.ijg.org/files/jpegsrc.v9f.tar.gz) cd jpeg-9f ./configure --prefix=/home/jeremy/video_stream/mjpeg/mjpeg \ --host=arm-none-linux-gnueabihf \ --build=aarch64-unknown-linux-gnu `--prefix`:用来指定编译后软件的安装路径; `--host`:用来指定编译时使用的工具链; `--build`:这个选项用来指定编译软件的机器类型。 这两个参数 可以根据自己的实际情况来修改。 这里./configure是为了生成Makefile的
配置成功显示如下:
编译
make -j8
编译成功显示如下:
安装
make install
安装成功显示如下:
查看安装路径
将编译好的库文件拷贝到根文件系统中:
cd /home/jeremy/video_stream/mjpeg/mjpeg/lib cp * ~/rootfs/lib/ -rf
3. mjpeg-streamer移植
下载 mjpg-streamer 源码:
mjpg-streamer-code-r182-mjpg-streamer将上述的源代码拿到ubuntu上并解压
unzip mjpg-streamer-code-r182-mjpg-streamer.zip
文件夹名字太长改一下
mv mjpg-streamer-code-r182-mjpg-streamer mjpg-streamer
查看文件夹
cd mjpg-streamer
1 编译器修改Makefile中的编译器
修改顶层目录及 中的 Makefile 文件:
修改
CC = gcc
为:
CC = arm-none-linux-gnueabihf-gcc
2 再次修改 plugins/input_uvc/Makefile(将刚才编译的mjpeg用上)
3 文件在第 14 行附加编译时需要的 mjpeg 头文件的路径
CFLAGS += -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC
改为:
CFLAGS += -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC \ -I /home/jeremy/video_stream/mjpeg/mjpeg/include/
4 在第 33 行添加编译时需要的 mjpeg 库的路径
修改$(CC) $(CFLAGS) -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo $(LFLAGS)
为:$(CC) $(CFLAGS) -L /home/jeremy/video_stream/mjpeg/mjpeg/lib -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo $(LFLAGS)
5 修改代码
将如下文件中initDynCtrls注释掉plugins/input_uvc/input_uvc.c
将如下文件中initDynCtrls注释掉plugins/input_control/input_uvc.c
原因是上述是对摄像头的动态控制 (用于控制视频设备的各种参数,如亮度、对比度、饱和度等。), 但是OV5640摄像头部分动态控制不支持,所以直接注释掉即可。
- 编译代码(顶层目录)
make clean
make
出现以下错误:
原因:
这个错误是由于 struct statx
和 struct statx_timestamp
在 utils.c
文件中被重复定义了。可能是因为在 utils.c
中同时包含了 <sys/stat.h>
和 <linux/stat.h>
,这两个头文件都定义了这些结构。
解决方法:
只包含 <sys/stat.h>
,不包含 <linux/stat.h>
。
打开源码根目录下utils.c文件注释掉*#include <linux/stat.h>
*
继续编译:make -j8
出现以下错误:
错误原因:
搜一下`cams`,仔细观察发现`/home/jeremy/video_stream/mjpg-streamer/plugins/input_uvc/input_uvc.c` ,`/home/jeremy/video_stream/mjpg-streamer/plugins/input_uvc/v4l2uvc.h` 文件中有cams的定义:
这个定义在头文件中创建了一个全局数组 `cams`,数组的类型是 `context`,大小是 `MAX_INPUT_PLUGINS`。这可能是导致在编译时遇到 "multiple definition of `cams`" 错误的原因。 在头文件中定义全局变量是一种常见的错误。当头文件被多个源文件包含时,每个源文件都会得到一个全局变量的副本,这在链接时会导致多重定义错误。
解决方法:
在头文件中只声明全局变量,而在一个源文件中定义它。在 `v4l2uvc.h` 中声明 `cams`:
*// v4l2uvc.h extern context cams[MAX_INPUT_PLUGINS];*
然后在 v4l2uvc.c
中定义 cams
:
*// v4l2uvc.c context cams[MAX_INPUT_PLUGINS];*
继续编译:make -j8
编译成功如下:
- 拷贝程序及库到根文件系统中
mkdir ~/rootfs/mjpeg cp *.so ~/rootfs/mjpeg cp mjpg_streamer ~/rootfs/bin
启动开发板测试mjpg_streamer, IP地址填写开发板的IP
mjpg_streamer -i “/mjpeg/input_uvc.so -y -d /dev/video0” -o “/mjpeg/output_http.so -w 192.168.2.10:8080”打开网页输入网址查看摄像头采集到的图形:
浏览器上地址栏输入如下内容:http: 192.168.2.10:8080/?action=snapshot
或者http: 192.168.2.10:8080/?action=stream
snapshot 表示每次抓拍一张图形显示在网页上,stream 表示视频流也就是连续的图像
现象如下: