windows平台的ffmpeg相关库可以在官网直接下载,但linux由于工具链不同,使用的时候大多需要自己手动去编译。本文记录了此次编译过程中遇到的一些问题。
1、ffmepg源码下载,ndk下载安装。没有难度,网上很多文章介绍。
2、编译ffmpeg。
-
编译选项配置,可参考下面shell脚本。主要包括设置编译链,设置编译的功能模块。如果没有将不相关的模块disable掉的话,编译出来的库文件会非常大,尤其是avcodec,会达到一百多兆。(具体配置以实际需求为准)
#!/bin/sh
#--disable-avdevice
NDK=/opt/android-ndk-r9/
export PATH=$PATH:$NDK
SYSROOT=$NDK/platforms/android-8/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
export RANLIB=$TOOLCHAIN/bin/arm-linux-androideabi-ranlib
function build_one
{
./configure \
--prefix=$PREFIX \
--disable-shared \
--enable-static \
--disable-yasm \
--disable-decoders --enable-decoder=aac --enable-decoder=h264 \
--disable-muxers \
--disable-parsers --enable-parser=aac --enable-parser=h264 \
--disable-filters \
--disable-avfilter \
--disable-swscale \
--disable-encoders \
--enable-small \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-doc \
--disable-debug \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT
make clean
make -j4
make install
}
CPU=armv7-a
PREFIX=$(pwd)/android/$CPU
build_one
-
执行shell脚本,开始编译。这里要注意,如果不小心将某个编译配置项写错了,则所有配置都不会生效。执行后注意观察结果。出现类似如下图日志,最后其实还是按照默认配置去编译的。 Unknown option "--enable-decoders=aac". See ./configure --help for available options.
-
编译完成后,库文件默认是在/user/local/lib 下面,不过也可以自己设置。具体用法查看./configure --help 。
3、其它编译问题
ffmpeg编译本身难度不大,无非就是设置好编译选项,直接make就好。但是在使用编译出来的库文件时,又遇到了其它编译问题。大概有这么几类:
1、/bin/sh^M: 坏的解释器: 没有那个文件或目录
一般是由于从windows环境下拷贝到linux后结尾多了"\r"导致,可以直接用sed -i 's/\r$//' 文件名 将\r替换掉。在执行shell脚本就没问题了。
2、找不到头文件,如stdio.h:50:23: fatal error: sys/cdefs.h: No such file or directory
用linux标准gcc编译一般可能没这问题,我是用ndk编译时报了这个错。后来查到引用头文件的位置不对,重新指定下就好。在编译c或c++时指定对应头文件位置。
#g++头文件的路径
C_INCLUDE_PATH=$C_INCLUDE_PATH:/opt/android-ndk-r9/platforms/android-8/arch-arm/usr/include
export C_INCLUDE_PATH
#gcc头文件的路径
CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/opt/android-ndk-r9/platforms/android-8/arch-arm/usr/include
export CPLUS_INCLUDE_PATH
3、找不到库文件。
#找到动态链接库的路径
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/android-ndk-r9/platforms/android-8/arch-arm/usr/lib
export LD_LIBRARY_PATH
#找到静态库的路径
LIBRARY_PATH=$LIBRARY_PATH:/opt/android-ndk-r9/platforms/android-8/arch-arm/usr/lib
export LIBRARY_PATH