视频服务器移植

视频服务器移植

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的
  1. 配置成功显示如下:
    在这里插入图片描述

  2. 编译
    make -j8

编译成功显示如下:
在这里插入图片描述

安装
make install

安装成功显示如下:
在这里插入图片描述

查看安装路径
在这里插入图片描述

将编译好的库文件拷贝到根文件系统中:

cd /home/jeremy/video_stream/mjpeg/mjpeg/lib
cp * ~/rootfs/lib/ -rf

在这里插入图片描述

3. mjpeg-streamer移植

  1. 下载 mjpg-streamer 源码:
    mjpg-streamer-code-r182-mjpg-streamer

  2. 将上述的源代码拿到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摄像头部分动态控制不支持,所以直接注释掉即可。

  1. 编译代码(顶层目录)
    make clean
    make

出现以下错误:
在这里插入图片描述

原因:

这个错误是由于 struct statxstruct statx_timestamputils.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

编译成功如下:
在这里插入图片描述

  1. 拷贝程序及库到根文件系统中
mkdir ~/rootfs/mjpeg
cp *.so ~/rootfs/mjpeg
cp mjpg_streamer ~/rootfs/bin
  1. 启动开发板测试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”

  2. 打开网页输入网址查看摄像头采集到的图形:
    浏览器上地址栏输入如下内容:
    http: 192.168.2.10:8080/?action=snapshot
    或者
    http: 192.168.2.10:8080/?action=stream
    snapshot 表示每次抓拍一张图形显示在网页上,stream 表示视频流也就是连续的图像
    现象如下:
    在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值