ijkplayer ffmpeg android独立编译

ijkplayer中ffmpeg编译前会需要生成android standalone工具链,其他的编译步骤基本跟标准ffmpeg的编译相同。
其编译主要依赖两个脚本,
(1)是顶级目录下config/module.sh
(2)是android/contrib/tool/do-compile-ffmpeg.sh中关于cross compile相关的内容。
于是我就自助了一个ffmpeg编译脚本。简单说明下,ijkplayer中是通过link *.o 成shared library。我查了下gcc本身支持将.a直接链接成.so库,即通过-Wl,–whole-archive参数。

#!/bin/bash
export candidates_dir="/xx/candidates"

build_ffmpeg()
{
    source ijkplayer/config/module.sh

    cd ffmpeg
    make distclean
    FF_CFG_FLAGS=""
    FF_CFLAGS=""

    if [ "$1" = "armv7a" ]; then
        FF_CROSS_PREFIX=arm-linux-androideabi
        FF_CFG_FLAGS="$FF_CFG_FLAGS --arch=arm --enable-neon --enable-thumb"
    fi

    BUILD="--enable-static --disable-shared"
    FF_CFG_FLAGS="$FF_CFG_FLAGS --cross-prefix=${FF_CROSS_PREFIX}- --enable-cross-compile --target-os=linux --enable-pic --enable-asm --enable-inline-asm --enable-optimizations --enable-debug --enable-small"
    FF_EXTRA_CFLAGS="$FF_EXTRA_CFLAGS -march=armv7-a -mfloat-abi=softfp -mthumb"
    FF_EXTRA_LDFLAGS="$FF_EXTRA_LDFLAGS"

    ./configure --prefix=${candidates_dir} ${FF_CFG_FLAGS} ${COMMON_FF_CFG_FLAGS} $BUILD --extra-cflags="-I${candidates_dir}/include $FF_CFLAGS $FF_EXTRA_CFLAGS" --extra-ldflags="-L${candidates_dir}/lib $FF_DEP_LIBS $FF_EXTRA_LDFLAGS" --extra-libs="-ldl"
    make -j4
    make install
    cd -
    cd ${candidates_dir}/lib
    ${FF_CROSS_PREFIX}-gcc -shared -fPIC -o libijkffmpeg.so -Wl,--no-undefined -Wl,--whole-archive -lm -lz libavformat.a libavcodec.a libavutil.a libavfilter.a libswresample.a libswscale.a -Wl,--no-whole-archive -lgcc
}

build_ffmpeg armv7a

你可能感兴趣的:(安卓驱动开发)