项目需要在zedboard上使用OpenCV对视频进行处理,所以需要FFmpeg的支持。
FFmpeg是一种开源的软件,可以对视频和音频进行录制,转换和流功能,它包含libavcodec(音频和视频的解码库),和libavformat,libavutils和其他辅助性的库。这些库在OpenCV的highgui模块调用来处理音视频。
对OpenCV交叉编译有点麻烦,特将编译过程及遇到的问题和解决办法记录一下
s首先说下编译环境及所用库的版本号
项目 | 版本号 | 链接 |
---|---|---|
操作系统 | Ubuntu 14.04 | |
OpenCV | 2.4.13 | opencv-2.4.13.zip |
FFmpeg | 3.1.4 | ffmpeg-3.1.4.tar.bz2 |
x264 | 20161020 | x264-snapshot-20161019-2245-stable.tar.bz2 |
libjpeg | 9.0.0 | jpegsrc.v9.tar.gz |
libpng | 1.6.25 | libpng-1.6.25.tar.gz |
xvidcore | 1.3.4 | xvidcore-1.3.4.tar.gz |
因为要在zedboard上运行,所以安装xilinx的交叉编译工具,可以从github上下载也可以从这里下载我用的,因为这个工具是32位系统设计的,64位系统需要先安装部分32位的库
sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0 libgtk2.0-0:i386
然后将dash更改为bash
sudo dpkg-reconfigure dash
在弹出的对话框中选择NO,将dash更改为bash,然后修改下安装程序的权限
sudo chmod u+x xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin
执行安装程序
(sudo)./xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin
可以选择用管理员权限安装,此时安装后的执行文件的路径为
/root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/
不使用管理员权限安装的执行文件路径为:
/home//CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/
最后需要修改一下环境变量,将install path更改为上述交叉编译工具的执行文件安装路径
export ARCH=arm
export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
export PATH=:$PATH
这个以后面的依赖库编译和安装都需要首先进行配置
tar -xzvf jpegsrc.v9.tar.gz
cd jpeg-9
./configure --host=arm-xilinx-linux CC=arm-xilinx-linux-gnueabi-gcc --prefix=<dependency install path>
make
make install
可以在配置的时候指定将编译好的库安装的位置,或者使用”sudo make install”直接安装在”/usr/local/lib”里,以下安装方式类似。
可以切换到安装的文件夹下查看是否交叉编译成功
file libjpeg.so.9.0.0
如果输出信息为
libjpeg.so.9.0.0: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, not stripped
说明交叉编译成功
zlib需要预先指定CC选项
export CC=arm-xilinx-linux-gnueabi-gcc
./configure --shared --prefix=<dependency install path>
make
make install
因为libpng交叉编译需要用到zlib,所以需要在编译该库之前交叉编译好zlib
export LDFLAGS="-L/lib"
export CPPFLAGS="-I/inclue"
./configure --host=arm-xilinx-linux CC=arm-xilinx-linux-gnueabi-gcc --prefix=<dependency install path>
在编译之前,需要指定zlib的库的安装路径和头文件位置,如果是用管理员权限安装的上述路径分别为
export LDFLAGS="-L/usr/local/lib"
export CPPFLAGS="-I/usr/local/include"
tar -xvf x264-snapshot-20161019-2245-stable.tar
cd x264-snapshot-20161019-2245-stable/
./configure --host=arm-xilinx-linux --cross-prefix=arm-xilinx-linux-gnueabi- --disable-asm --enable-shared --prefix=<dependency install path>
make
make install
xvidcore的配置文件在/build/generic里
cd build/generic
./configure --host=arm-xilinx-linux-gnueabi --disable-assembly --enable-shared --prefix=<dependency install path>
make
make install
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
cd ffmpeg
./configure --enable-shared --disable-static --cross-prefix=arm-xilinx-linux-gnueabi-
--arch=arm --target-os=linux --disable-stripping --enable-cross-compile --disable-asm
--enable-libxvid --enable-libx264 --enable-gpl
--extra-cflags=-I<dependency install path>/include --extra-ldflags=-L<dependency install path>/lib --prefix=<dependency install path>
make
make install
首先写一个toolchain.make文件,将下面内容复制进去
set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR arm )
set( CMAKE_C_COMPILER arm-xilinx-linux-gnueabi-gcc )
set( CMAKE_CXX_COMPILER arm-xilinx-linux-gnueabi-g++ )
set( CMAKE_FIND_ROOT_PATH "/usr/local/lib" )
set( CMAKE_C_FLAGS "-Wl,-rpath-link=/usr/local/lib")
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和CMAKE_C_FLAGS里的路径要修改为前面那些依赖和FFmpeg的安装路径
解压OpenCV源码,并生成Makefile文件
mkdir build
cd build
cmake -D CMAKE_TOOLCHAIN_FILE=../toolchain.make -D BUILD_opencv_nonfree=OFF ../opencv-2.4.13
如果系统内没有安装cmake需要先安装和下面用到的cmake图形工具
sudo apt-get install cmake cmake-curses-gui
然后配置OpenCV的编译选项
ccmake .
使用上下方向键可以翻页,至少以下几个选项为ON,
按’c’然后按’g’来生成Makefile
然后运行
make
make install
编译过程要花费一段时间,编译成功之后就能生成相应的*.so文件
在编译libpng时需要指定zlib的库文件和头文件的位置,可以按照上面说的配置方法或者直接在配置时指定位置
./configure --host=arm-xilinx-linux CC=arm-xilinx-linux-gnueabi-gcc --prefix=<dependency install path> LDFLAGS=−L<dependency install path>/lib CFLAGS=-I<dependency install path>/include
主要是编译FFmpeg时没有找到x264.h这个头文件,所以需要在配置FFmpeg时增加编译选项
--extra-cflags=-Iinstall path>/include --extra-ldflags=-Linstall path>/lib
“dependency install path”为x264的安装路径
/tmp/ccwOsjxB.s: Assembler messages:
/tmp/ccwOsjxB.s:20222: Error: selected processor does not support ARM mode `ubfx sl,r2,#0,#4'
/tmp/ccwOsjxB.s:20223: Error: selected processor does not support ARM mode `ubfx fp,r2,#4,#4'
/tmp/ccwOsjxB.s:20390: Error: selected processor does not support ARM mode `ubfx r0,r3,#0,#4'
/tmp/ccwOsjxB.s:20391: Error: selected processor does not support ARM mode `ubfx sl,r3,#4,#4'
/tmp/ccwOsjxB.s:20546: Error: selected processor does not support ARM mode `ubfx r8,r2,#0,#2'
/tmp/ccwOsjxB.s:20547: Error: selected processor does not support ARM mode `ubfx r9,r2,#2,#2'
/tmp/ccwOsjxB.s:20549: Error: selected processor does not support ARM mode `ubfx sl,r2,#4,#2'
/tmp/ccwOsjxB.s:20551: Error: selected processor does not support ARM mode `ubfx fp,r2,#6,#2'
/tmp/ccwOsjxB.s:20707: Error: selected processor does not support ARM mode `ubfx r9,r7,#0,#2'
/tmp/ccwOsjxB.s:20708: Error: selected processor does not support ARM mode `ubfx sl,r7,#2,#2'
/tmp/ccwOsjxB.s:20710: Error: selected processor does not support ARM mode `ubfx fp,r7,#4,#2'
/tmp/ccwOsjxB.s:20712: Error: selected processor does not support ARM mode `ubfx ip,r7,#6,#2'
/tmp/ccwOsjxB.s:20717: Error: selected processor does not support ARM mode `rbit r2,r2'
make: *** [libavcodec/aacdec.o] Error 1
在配置FFmpeg时加上–disable-asm选项
bin/ld:warning: libz.so.1, needed by .../libopencv_core.so, not found (try using -rpath or -rpath-link)
bin/ld:warning: libavcodec.so.57, needed by .../libopencv_core.so, not found (try using -rpath or -rpath-link)
后面会有一系列的undefined reference to `xxx’
可以在环境变量中添加
export LDFLAGS=-Wl,-rpath-link,/usr/local/lib
并且修改toolchain.make文件,添加下列内容
set( CMAKE_FIND_ROOT_PATH "/usr/local/lib" )#此路径为安装后的依赖库的路径
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
最开始时我编写的toolchain.make配置文件只有CMAKE_SYSTEM_NAME,CMAKE_SYSTEM_PROCESSOR,CMAKE_C_COMPILER,CMAKE_CXX_COMPILER这几个选项,在更改好环境变量后还是会报上述错误,直到参考[2]添加了上述几个选项后顺利编译通过