嵌入式环境下基于onvif协议取得的RTSP视频流以及opencv的交叉编译

Linux版本:ubuntu12.04

Arm平台:Tiny4412

交叉编译工具:arm-none-linux-gnueabi-gcc-4.5.1、arm-none-linux-gnueabi-g++

  • 交叉编译opencv:

1、准备opencv依赖库以及opencv源码包:zlib-1.2.7、jpegsrc.v7、libpng-1.5.8、yasm-1.3.0、x264-snapshot-20120608-2245、xvidcore-1.3.3、ffmpeg-2.8.14、opencv-2.4.9

2、编译libz:

进入zlib源码目录,

执行:

 ./configure --prefix=./configure --prefix=/opt/exynos4412-linux/arm-linux-4.5.1/arm-none-linux-gnueabi –shared

(--prefix=可以修改为自己定义的安装目录)

修改makefile

CC=arm-linux-gcc

AR=arm-linux-ar

RANLIB=arm-linux-ranlib

LDSHARED=arm-linux-gcc -shared -wl, -soname,libz.so.1,--version-script,zl

lib.map

make

make install

生成的库文件:

生成的头文件:

3、编译libjpeg:

进入libjpeg源码目录,

执行:

./configure --host=arm-linux --prefix=/opt/exynos4412-linux/arm-linux-4.5.1/arm-none-linux-gnueabi --enable-shared --enable-static

make

make install

生成库文件:

生成头文件:

4、编译libpng:

进入libpng源码目录,

执行:

./configure --host=arm-linux --prefix=/opt/exynos4412-linux/arm-linux-4.5.1/arm-none-linux-gnueabi --enable-shared --enable-static

make

make install

生成库文件:

生成头文件:

5、编译yasm:

进入yasm目录,

执行:

./configure --host=arm-linux --prefix=/opt/exynos4412-linux/arm-linux-4.5.1/arm-none-linux-gnueabi --enable-shared --enable-static

make

make install

生成库文件:

生成头文件:

6、编译libx264:

进入libx264目录,

执行:

CC=arm-linux-gcc-4.5.1 ./configure --enable-shared --host=arm-linux --disable-asm --prefix=/opt/exynos4412-linux/arm-linux-4.5.1/arm-none-linux-gnueabi

make

make install

生成库文件:

生成头文件:

7、编译libxvid:

进入libxvid下的build/generic/目录,

执行:

./configure --prefix=/opt/exynos4412-linux/arm-linux-4.5.1/arm-none-linux-gnueabi --host=arm-linux --enable-shared --disable-assembly

make

make install

生成库文件:

生成头文件:

8、编译ffmpeg:

进入ffmpeg目录,

执行:

./configure --prefix=/opt/exynos4412-linux/arm-linux-4.5.1/arm-none-linux-gnueabi --enable-shared --disable-static --enable-gpl --enable-cross-compile --arch=arm --disable-stripping --target-os=linux --enable-libx264 --enable-libxvid extra-cflags=-I/opt/exynos4412-linux/arm-linux-4.5.1/arm-none-linux-gnueabi/include --extra-ldflags=-L/opt/exynos4412-linux/arm-linux-4.5.1/arm-none-linux-gnueabi/lib --cc=arm-linux-gcc --enable-swscale

make

make install

生成库文件:

嵌入式环境下基于onvif协议取得的RTSP视频流以及opencv的交叉编译_第1张图片

生成头文件:

嵌入式环境下基于onvif协议取得的RTSP视频流以及opencv的交叉编译_第2张图片

=====================================================================

在生成的库文件的路径有一个pkgconfig文件夹,里面是编译上面各个库时候生成的.pc文件,.pc文件存放的是生成的库文件安装路径以及头文件路径,还有库的版本信息。例如打开zlib.pc:

嵌入式环境下基于onvif协议取得的RTSP视频流以及opencv的交叉编译_第3张图片

此时,可以在终端输入ehco $PKG_CONFIG_PATH命令查看系统搜索库文件的路径。系统默认是从/lib以及/usr/lib下搜索。可以通过修改/etc/profile配置文件使在下一步编译opencv时从刚才安装opencv依赖库文件的路径搜索对应的库文件。

9、编译opencv_2.4.9:

进入opencv_2.4.9源码目录,新建编译目录build,进入build目录,新建一个toolchain.cmake文件,加入以下内容:

set( CMAKE_SYSTEM_NAME Linux )

set( CMAKE_SYSTEM_PROCESSOR arm )

set( CMAKE_C_COMPILER arm-linux-gcc )

set( CMAKE_CXX_COMPILER arm-linux-g++ )

set( CMAKE_FIND_ROOT_PATH "/opt/exynos4412-linux/arm-linux-4.5.1/arm-none-linux-gnueabi" )

set( CMAKE_C_FLAGS "-Wl,-rpath-link=/opt/exynos4412-linux/arm-linux-4.5.1/arm-none-linux-gnueabi")

set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )

set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )

set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )

CMAKE_FIND_ROOT_PATH为前面安装的依赖库的目录。

然后在build目录下执行:

cmake -D CMAKE_TOOLCHAIN_FILE=toolchain.cmake ../

可以看到输出信息有:

嵌入式环境下基于onvif协议取得的RTSP视频流以及opencv的交叉编译_第4张图片

支持FFMPEG编解码。

生成CMakeCache.txt文件,里面存放的是配置信息

可以通过cmake-gui载入该文件从而通过可视化界面修改配置信息。还可以在build目录下执行:ccmake .也可以修改配置信息。

 

需要关闭的编译选项有:

嵌入式环境下基于onvif协议取得的RTSP视频流以及opencv的交叉编译_第5张图片

WITH_1394、WITH_CUBLAS、WITH_CUDA、WITH_GTK、WITH_LIBV4L、WITH_OPENCL、WITH_OPENEXR、WITH_OPENGL、WITH_TIFF

可以CMAKE_INSTALL_PREFIX选项更修改opencv库的安装目录。

修改完后,按C生成配置文件,按G保存更改。

修改CMakeCache.txt的CMAKE_EXE_LINKER_FLAGS:STRING=

加上-lpthread -lrt

执行:

make

make install

生成库文件:

嵌入式环境下基于onvif协议取得的RTSP视频流以及opencv的交叉编译_第6张图片

生成头文件:

嵌入式环境下基于onvif协议取得的RTSP视频流以及opencv的交叉编译_第7张图片

 

二、gsoap生成onvif框架代码:

本人开发环境为:

  1. 虚拟机:Ubuntu12.04
  2. 必备网址:

 Onvif官网:http://www.onvif.org/

 gsoap官网:http://www.cs.fsu.edu/~engelen/soap.html

3. 下载gsoap

根据以上提供的地址,登陆gsoap官网下载最新的安装包和相关文档;截止今天(2013年8月5日),官网发布的最新版本的gsoap工具为2.8.15版本;最新版本的使用,可以参考文档:《gSOAP 2.8.15 User Guide .pdf》,该文档有非常详细的说明,现在网络上的大部分的demo都是copy这里的;该文档值得研究;该文档在其官网上可以下载,下载地址为:http://www.cs.fsu.edu/~engelen/soap.html;也可以在官网在线查看;或者,可以在gsoap安装包里面找到该文档,路径为:gsoap_2.8.15/gsoap-2.8/gsoap/doc, 名字为soapdoc2.pdf的文件。

4. 安装

将下载的安装包解压,并拷贝到linux的操作目录,本人操作目录为:

$: /gsoap-2.8

以上面的目录为例:(注意以下操作均在root用户权限下进行)

首先进入目录cd /gsoap-2.8/

然后,配置编译环境:

命令:$:./configure --host=arm-linux CC=arm-linux-gcc --prefix=/usr/local/x86-gsoap-2.8

然后,编译连接

命令:$:make

 

编译gsoap时如果报错:/gsoap-2.8/missing: line 81: aclocal-1.15: command not found

解决方法为:

安装新版本的automake

wget http://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz

最后,安装gSOAP

命令:$:make install

 

5. onvif头文件生成

 

命令wsdl2h用于生成头文件,命令soapcpp2用于生成源文件;这两个命令在/usr/local/x86-gsoap-2.8/bin中可以找到。

工具安装完成之后可以在linux下重新建立一个自己的目录,用来生成代码:

这里建立目录:onvif-source

完整路径为:/usr/local/onvif-source/

将gsoap 目录下的typemap.dat文件拷贝到目录onvif-source

(1)在线生成头文件:

在onvif-source目录下执行命令(加上-c可以只生成客户端代码):

./wsdl2h -o onvif.h -s -t ./typemap.dat

http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl

http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl

http://www.onvif.org/onvif/ver10/display.wsdl

http://www.onvif.org/onvif/ver10/deviceio.wsdl

http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.wsdl

http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl

http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl

http://www.onvif.org/onvif/ver10/receiver.wsdl

http://www.onvif.org/onvif/ver10/recording.wsdl

http://www.onvif.org/onvif/ver10/search.wsdl

http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl

http://www.onvif.org/onvif/ver10/replay.wsdl

http://www.onvif.org/onvif/ver20/analytics/wsdl/analytics.wsdl

http://www.onvif.org/onvif/ver10/analyticsdevice.wsdl

http://www.onvif.org/onvif/ver10/schema/onvif.xsd

http://www.onvif.org/ver10/actionengine.wsdl

每个网址之间用空格分开,执行完命令即可生成头文件onvif.h。

 (2)离线生成头文件

如果当前电脑无法联网,则可以通过离线的方式来生成,命令为:

~onvif_new$: wsdl2h -o onvif.h -c -s -t ./typemap.dat devicemgmt.wsdl media.wsdl event.wsdl display.wsdl

deviceio.wsdl imaging.wsdl ptz.wsdl receiver.wsdl recording.wsdl search.wsdl remotediscovery.wsdl

replay.wsdl analytics.wsdl analyticsdevice.wsdl actionengine.wsdl accesscontrol.wsdl doorcontrol.wsdl

注意不同的wsdl以空格分开。

目前Onvif官网提供的最新的WSDL文件一共有17个,可以将其下载下来。不过这些文件直接都是相互关联的,下载的话,除了这17个文件之外,还要下载所有相关联的文件。另外,下载之后,还需要更改文件中的路径,将wsdl文件中的schemaLocation以及location所指的路径进行修改,修改为本地的地址。将所有需要下载的文件下载到onvif_new目录,并修改相关地址。当然如果网速够快,提倡直接在线生成头文件和源文件。另外为了避免后续开发过程中出现某些功能的缺省,最好一次性生成包含所有功能的代码。

6. 源文件的生成

生成onvif.h头文件之后,即可根据soapcpp2命令生成C源文件或者CPP源文件(加上-c可以生成.c源文件)。

命令为:

./soapcpp2 onvif.h -x -I /gsoap-2.8/gsoap/import/ -I /gsoap-2.8/gsoap/

生成过程中有错误:

wsa5.h(288): **ERROR**: remote method name clash: struct/class 'SOAP_ENV__Fault' already declared at line 274

 

可以发现这是由于重复定义导致,可以修改该文件。

打开文件/gsoap-2.8/gsoap/import/wsa5.h,将277行int SOAP_ENV__Fault修改为int SOAP_ENV__Fault_alex

再执行命令:./soapcpp2 onvif.h -x -I /gsoap-2.8/gsoap/import/ -I /gsoap-2.8/gsoap/

生成成功会有Compilation successful字样。

生成的源文件:

开发onvif客户端所需要的源文件有:

需要的头文件有:

duration.cpp、duration.h存放在gsoap的源码目录下:

 

 

 

 

 

你可能感兴趣的:(嵌入式环境下基于onvif协议取得的RTSP视频流以及opencv的交叉编译)