视频服务器移植

avatar
作者
筋斗云
阅读量:5

视频服务器移植

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 表示视频流也就是连续的图像
    现象如下:
    在这里插入图片描述

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!