Linux 交叉编译android版本的ffmpeg(支持多CPU架构)

xingyun86 2019-10-10 1925

1.安装并更新yasm

若版本过低则无法编译x86和x86_64版本

yum install yasm

apt-get install yasm

2.下载ndk

wget https://dl.google.com/android/repository/android-ndk-r20-linux-x86_64.zip

3.下载ffmpeg

wget https://ffmpeg.org/releases/ffmpeg-4.2.1.tar.bz2

4.解压ndk

cd /home/pps

unzip android-ndk-r20-linux-x86_64.zip

5.解压ffmpeg

cd /home/pps

tar xvf ffmpeg-4.2.1.tar.bz2

cd ffmpeg-4.2.1

5.1 修改configure

vi configure

SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'

修改为:

SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'

5.2 在ffmpeg-4.2.1根目录外面一层目录下新建build_android.sh

#!/bin/bash
NDK=/home/ppshuai/dev-tool/android-ndk-r20
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
API=21

function build_android
{
echo "Compiling FFmpeg for $CPU"
./configure \
    --prefix=$PREFIX \
    --enable-neon \
    --enable-hwaccels \
    --enable-gpl \
    --enable-postproc \
    --enable-shared \
    --enable-jni \
    --enable-mediacodec \
    --enable-decoder=h264_mediacodec \
    --disable-static \
    --disable-doc \
    --enable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --enable-avdevice \
    --disable-doc \
    --disable-symver \
    --cross-prefix=$CROSS_PREFIX \
    --target-os=android \
    --arch=$ARCH \
    --cpu=$CPU \
    --cc=$CC \
    --cxx=$CXX \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}

#armv8-a
ARCH=arm64
CPU=armv8-a
OUT=arm64-v8a
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=$(pwd)/android/$OUT
OPTIMIZE_CFLAGS="-march=$CPU"
ADDITIONAL_CONFIGURE_FLAG=""
build_android

#armv7-a
ARCH=arm
CPU=armv7-a
OUT=armeabi-v7a
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$OUT
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU"
ADDITIONAL_CONFIGURE_FLAG=""
build_android

#x86_64
ARCH=x86_64
CPU=x86-64
OUT=x86_64
CC=$TOOLCHAIN/bin/x86_64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/x86_64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-
PREFIX=$(pwd)/android/$OUT
OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 -mtune=intel"
ADDITIONAL_CONFIGURE_FLAG=""
build_android

#x86
ARCH=x86
CPU=x86
OUT=x86
CC=$TOOLCHAIN/bin/i686-linux-android$API-clang
CXX=$TOOLCHAIN/bin/i686-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android-
PREFIX=$(pwd)/android/$OUT
OPTIMIZE_CFLAGS="-march=i686 -msse3 -mfpmath=sse -m32 -mtune=intel"
ADDITIONAL_CONFIGURE_FLAG="--disable-inline-asm"
build_android

6.执行编译

cd /home/pps/ffmpeg-4.2.1

sudo ../build_android.sh


×
打赏作者
最新回复 (0)
只看楼主
全部楼主
返回