linux下ffmpeg库 ARM交叉编译

Posted tgww88

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下ffmpeg库 ARM交叉编译相关的知识,希望对你有一定的参考价值。

 

一、前言:

        因为想用ffmpeg实现录像网络视频流功能,所以需要编译ffmpeg相关库,不过目前对视频方面很多知识还是小白,后续会写一些关于视频方面知识的文章

 

二、准备工作

        1、ffmpeg源码地址:http://ffmpeg.org

         作者目前版本是ffmpeg-3.0.2

        2、编译器:arm-none-linux-gnueabi

 

三、安装编译

         1、生成makefile文件

          主要就是更改./configure文件,按照网上很多前辈的经验,配置项如下:

    ./configure --cross-prefix=arm-none-linux-gnueabi- --enable-cross-compile --target-os=linux --cc=arm-none-linux-gnueabi-gcc --arch=arm --prefix=/usr/local/ffmpeg --enable-shared --disable-static --enable-gpl --enable-nonfree --enable-ffmpeg --disable-ffplay --enable-ffserver --enable-swscale --enable-pthreads --disable-armv5te --disable-armv6 --disable-armv6t2 --disable-yasm --disable-stripping --enable-libx264 

         相关选项描述可以参考http://www.cnblogs.com/azraelly/archive/2012/12/31/2840541.html       

         关于--cross-prefix选项,看文档介绍是指定编译工具链的路径,上述命令之后会报警告:WARNING: arm-none-linux-gnueabi-pkg-config not found, library detection may fail.这里面是说没有pkg-config相关工具,我目前还不知道怎么安装arm-none-linux-gnueabi-cross-compile的pkg-config工具,但是这貌似不影响后续的使用。

         下面总结下上述命令执行遇到的一些问题,因为作者需要libx264库进行编解码,所以需要链接libx264静态库可能很多像我这样的小白都会遇到,特总结如下:

        (1)上述命令执行实际是会报错的,错误信息如下:ERROR: libx264 not found

          这里也就不卖关子了,还是得查看config.log,看看为什么会报错,所以做技术来不得半点偷懒。

check_cpp
BEGIN /tmp/ffconf.42QaWrDA.c
    1 #include <x264.h>
    2 int x;
END /tmp/ffconf.42QaWrDA.c
arm-none-linux-gnueabi-gcc -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -march=armv5te -std=c99 -fomit-frame-pointer -marm -pthread -E -o /tmp/ffconf.aGoA0I51.o /tmp/ffconf.42QaWrDA.c
/tmp/ffconf.42QaWrDA.c:1:18: fatal error: x264.h: No such file or directory
compilation terminated.
ERROR: libx264 not found

          其实上面的意思已经很明白了,因为找不到x264.h头文件。奇怪,在上一篇文章中,大家也看到明明将x264小心翼翼的放到/usr/local/include目录下了,怎么会找不到呢?原来是编译的时候没有指定路径的缘由。于是乎在上述命令后加上了相关的编译选项--extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib

    ./configure --cross-prefix=arm-none-linux-gnueabi- --enable-cross-compile --target-os=linux --cc=arm-none-linux-gnueabi-gcc --arch=arm --prefix=/usr/local/ffmpeg --enable-shared --disable-static --enable-gpl --enable-nonfree --enable-ffmpeg --disable-ffplay --enable-ffserver --enable-swscale --enable-pthreads --disable-armv5te --disable-armv6 --disable-armv6t2 --disable-yasm --disable-stripping --enable-libx264 --extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib

         注:这里面不清楚什么路径下可以不用加此编译选项,望有高人指点。网上也有其他一些方法,这里不再敖述。

       

       (2)作者想这下总该大功告成了吧,系统就是这么不安分,又狠狠地煽了我一耳光,执行上述命令后还是报错同样的错误,难道路径写错了?看了config.log后原来还是自己太天真了,不说了,上log。

arm-none-linux-gnueabi-gcc -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -I/usr/local/include -march=armv5te -std=c99 -fomit-frame-pointer -marm -pthread -c -o /tmp/ffconf.7kpBfq0i.o /tmp/ffconf.GiosUL4b.c
cc1: warning: include location "/usr/local/include" is unsafe for cross-compilation [-Wpoison-system-directories]
arm-none-linux-gnueabi-gcc -L/usr/local/lib -march=armv5te -Wl,--as-needed -Wl,-z,noexecstack -o /tmp/ffconf.Dloiqgee /tmp/ffconf.7kpBfq0i.o -lx264 -lm -pthread
/boards/compilers/gcc/arm-none-linux-gnueabi/arm-2013q5/bin/../lib/gcc/arm-none-linux-gnueabi/4.7.3/../../../../arm-none-linux-gnueabi/bin/ld: warning: library search path "/usr/local/lib" is unsafe for cross-compilation
/usr/local/lib/libx264.a(opencl.o): In function `x264_opencl_load_library':
opencl.c:(.text+0x4f0): undefined reference to `dlopen'
opencl.c:(.text+0x504): undefined reference to `dlsym'
opencl.c:(.text+0x51c): undefined reference to `dlsym'
opencl.c:(.text+0x534): undefined reference to `dlsym'
opencl.c:(.text+0x54c): undefined reference to `dlsym'
opencl.c:(.text+0x564): undefined reference to `dlsym'
/usr/local/lib/libx264.a(opencl.o):opencl.c:(.text+0x57c): more undefined references to `dlsym' follow
/usr/local/lib/libx264.a(opencl.o): In function `x264_opencl_load_library':
opencl.c:(.text+0x7a0): undefined reference to `dlclose'
/usr/local/lib/libx264.a(opencl.o): In function `x264_opencl_close_library':
opencl.c:(.text+0x83c): undefined reference to `dlclose'
/usr/local/lib/libx264.a(opencl.o): In function `x264_opencl_lookahead_init':
opencl.c:(.text+0x1254): undefined reference to `dlopen'
opencl.c:(.text+0x1264): undefined reference to `dlsym'
opencl.c:(.text+0x1274): undefined reference to `dlsym'
opencl.c:(.text+0x1284): undefined reference to `dlsym'
opencl.c:(.text+0x1294): undefined reference to `dlsym'
opencl.c:(.text+0x12fc): undefined reference to `dlclose'
opencl.c:(.text+0x1308): undefined reference to `dlclose'
opencl.c:(.text+0x1b38): undefined reference to `dlclose'
collect2: error: ld returned 1 exit status
ERROR: libx264 not found

         原来是找不到dl库,链接上dl库应该就可以了,新改的./configure命令如下:

./configure --cross-prefix=arm-none-linux-gnueabi- --enable-cross-compile --target-os=linux --cc=arm-none-linux-gnueabi-gcc --arch=arm --prefix=/usr/local/ffmpeg --enable-shared --disable-static --enable-gpl --enable-nonfree --enable-ffmpeg --disable-ffplay --enable-ffserver --enable-swscale --enable-pthreads --disable-armv5te --disable-armv6 --disable-armv6t2 --disable-yasm --disable-stripping --enable-libx264 --extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib --extra-libs=-ldl

          2、make

          3、make file

 

 

 

 

 

以上是关于linux下ffmpeg库 ARM交叉编译的主要内容,如果未能解决你的问题,请参考以下文章

linux下x264库ARM交叉编译

交叉编译ffmpeg(hi3520d)

交叉编译x264和ffmpeg

如何交叉编译 动态库

linux下 gcc可以编译hello.c arm-linux-gcc 无法找到libz.so.1

geos库交叉编译生成ARM平台库