上一次移植好的opencv没有ffmpeg,导致无法处理视频,经过几天的调试,总算弄好了。
1.检测你的opencv是否已经包含ffmpeg。这个很简单,用ldd命令查看可执行程序用了哪些动态库就知道了。如果没有检测到与ffmpeg相关的库,那说明opencv没配置完全,下面是详细配置过程。
2.交叉编译ffmpeg时先得交叉编译x264和xvid
2.1交叉编译xvid
到http://packman.links2linux.de/package/xvidcore下载xvid,我的下载版本为xvidcore-1.3.2
解压,cd进入xvid下的build/generic目录,执行以下命令:
./configure --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi --host=arm-linux --disable-assembly
make
make install
注意在make install时要root权限。安装目录为:/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi 自 己调整,但尽量放这里。
2.2交叉编译x264
到http://download.videolan.org/pub/videolan/x264/snapshots/下载x264,我下载的版本为x264-snapshot-20131113-2245-stable,解压,cd进入解压目录。执行以下命令:
CC=arm-linux-gcc ./configure --enable-shared --host=arm-linux --disable-asm --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi
make
make install
2.3交叉编译ffmpeg
ffmpeg两个依赖库已经编译好了,而且放在/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi目录下.
首先去http://ffmpeg.org/download.html下载ffmpeg,我下载的版本为FFmpeg 2.02 "Nameless",解压,cd进入解压目录,执行以下命令:
./configure --enable-cross-compile --target-os=linux --cc=arm-linux-gcc --arch=arm --enable-shared --disable-static --enable-gpl --enable-nonfree --enable-ffmpeg --disable-ffplay --enable-ffserver --enable-swscale --enable-pthreads --disable-yasm --disable-stripping --enable-libx264 --enable-libxvid --extra-cflags=-I/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/include --extra-ldflags=-L/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/
make
make install
注意上面的--extra-flags和--extra-ldflags,这两个路径指向你安装xvid和x264的路径。
到此,ffmpeg已经安装好了,你可以在/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi路径下的include和lib找到相关的文件, 在bin下面有ffmpeg和x264的可执行文件,用file命令查看其是否为arm的执行文件.
2.4将编译好的ffmpeg加入pkg-config
为什么要加入pkg-config?因为2.0版以后的opencv都是用cmake来生成 makefile文件,opencv通过调用pkg-config来查找相关依赖库,而默认的pkg-config在/usr下,我们安装的目录又不在/usr下,所以不加入pkg-config的话opencv是找不到ffmpeg的!!!
执行命令:
sudo gedit /etc/bash.bashrc
在打开的文档最后加入:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib/pkgconfig
export PKG_CONFIG_PATH
保存推出,重启电脑使其生效,可用命令查看当前pkg-config:pkg-config --list-all
应该有刚安装好的一些东西吧?
3.交叉编译opencv
上次我是用cmake-gui生成的makefile,但我很无语的发现这样找不到ffmpeg,那就只能参考官方的文档了:
http://docs.opencv.org/doc/tutorials/introduction/crosscompilation/arm_crosscompile_with_cmake.html#arm-linux-cross-compile
它用cmake调用opencv-2.4.6.1下的CMakeLists.txt和opencv-2.4.6.1/platforms/linux/arm-gnueabi.toolchain.cmake来生成makefile,但是arm-gnueabi.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++ )
保存,退出。
然后在opencv-2.4.6.1下建立一个build目录,cd进入该目录,执行一下命令:
cmake -DCMAKE_TOOLCHAIN_FILE=../platforms/linux/arm-gnueabi.toolchain.cmake ../
等待一会,你会发现控制台里输出了很多信息,有什么头文件找不到,但都无关要紧,你只需查看一下信息:
-- Video I/O:
-- DC1394 1.x: NO
-- DC1394 2.x: NO
-- FFMPEG: YES
-- codec: YES (ver 55.18.102)
-- format: YES (ver 55.12.100)
-- util: YES (ver 52.38.100)
-- swscale: YES (ver 2.3.100)
-- gentoo-style: YES
如果出现了,那么恭喜你,成功就在眼前了。用cmake-gui打开CMakeCache.txt,把一些无关要紧的都去掉,不然会出错的,最后我只剩以下这些打勾:
点击Configure和Generate,生成最后的makefile文件。
注意:如果你不想安装在当前build/install下,可以在CMAKE_INSTALL_PREFIX修改,如/usr/local/arm_opencv
ok,最后就是长久的等待了:
make
如果make没出错,那就成了,如果出错,自己慢慢找吧!
最后
make install
这个安装很蛋疼,反正我是出了各种各样的问题,出了问题分析一下,google or baidu,然后删除build重新安装,要相信自己总会成功滴!!!