Ubuntu下ndk編譯ffmpeng

Ubuntu下ndk編譯ffmpeng

下載和配置ndk

1.獲取資源
獲取sdkmanager可下載資源路徑 sdkmanager --list --sdk_root=${ANDROID_HOME}
2.找到ndk下可下載文件位置

  ndk-bundle| 21.2.6472646 | NDK                                                                 
  ndk;16.1.4479499| 16.1.4479499 | NDK (Side by side) 16.1.4479499                                     
  ndk;17.2.4988734| 17.2.4988734 | NDK (Side by side) 17.2.4988734                                     
  ndk;18.1.5063045| 18.1.5063045 | NDK (Side by side) 18.1.5063045                                     
  ndk;19.2.5345600| 19.2.5345600 | NDK (Side by side) 19.2.5345600                                     
  ndk;20.0.5594570| 20.0.5594570 | NDK (Side by side) 20.0.5594570                                     
  ndk;20.1.5948944| 20.1.5948944 | NDK (Side by side) 20.1.5948944                                     
  ndk;21.0.6113669| 21.0.6113669 | NDK (Side by side) 21.0.6113669                                     
  ndk;21.1.6352462| 21.1.6352462 | NDK (Side by side) 21.1.6352462                                     
  ndk;21.2.6472646| 21.2.6472646 | NDK (Side by side) 21.2.6472646   

3.下載 sdkmanager "ndk;17.2.4988734" --sdk_root=${ANDROID_HOME}
重要以上編譯版本都編譯不成功,各種問題,只能使用低版本了,我選用的 14b

ndk 15c - wget https://dl.google.com/android/repository/android-ndk-r15c-linux-x86_64.zip
ndk 14b - wget https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip 
ndk 13b - wget https://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip
ndk 13 - wget https://dl.google.com/android/repository/android-ndk-r13-linux-x86_64.zip
ndk 12b - wget https://dl.google.com/android/repository/android-ndk-r12b-linux-x86_64.zip

4.配置環境變量

// 打開/etc/profile文件
export NDK_HOME=ndk絕對路徑
export PATH=$NDK_HOME:$PATH

source /etc/profile

5.查看ndk配置是否成功

// 執行命令
echo $NDK_HOME // 查看路徑
// 查看ndK版本
ndk-build -v
// 顯示內容如下:
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for x86_64-pc-linux-gnu

獲取ffmpeg

1.下載

wget http://ffmpeg.org/releases/ffmpeg-3.1.11.tar.gz

2.解壓

tar -zxvf ffmpeg-3.1.11.tar.gz 

3.安裝make程序

sudo apt install make      
sudo apt install make-guile  

4.創建執行編譯的腳本文件 build_android.sh
執行文件放在 /home/用戶/ffmpeg-3.1.11/ 目錄下
執行 ./build_android.sh

#!/bin/sh
make clean

MY_LIBS_NAME=ffmpeg-3.1.11
MY_DIR=/home/用戶/ffmpeg-3.1.11

# cd ./${MY_DIR}

#編譯的過程中產生的中間件的存放目錄,爲了區分編譯目錄,源碼目錄,install目錄
MY_BUILD_DIR=binary


NDK_PATH=/home/用戶/android_sdk/ndk/android-ndk-r14b
BUILD_PLATFORM=linux-x86_64
TOOLCHAIN_VERSION=4.9
ANDROID_VERSION=21

ANDROID_ARMV5_CFLAGS="-march=armv5te"
ANDROID_ARMV7_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon"  #-mfloat-abi=hard -mfpu=vfpv3-d16 #-mfloat-abi=hard -mfpu=vfp
ANDROID_ARMV8_CFLAGS="-march=armv8-a"
ANDROID_X86_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
ANDROID_X86_64_CFLAGS="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel"


# params($1:arch,$2:arch_abi,$3:host,$4:cross_prefix,$5:cflags)
build_bin() {

    echo "-------------------start build $2-------------------------"

    ARCH=$1         # arm arm64 x86 x86_64
    ANDROID_ARCH_ABI=$2     # armeabi armeabi-v7a x86 mips

    PREFIX=$(pwd)/dist/${MY_LIBS_NAME}/${ANDROID_ARCH_ABI}/ # 輸出路徑

    HOST=$3
    SYSROOT=${NDK_PATH}/platforms/android-${ANDROID_VERSION}/arch-${ARCH}

    CFALGS=$5


    TOOLCHAIN=${NDK_PATH}/toolchains/${HOST}-${TOOLCHAIN_VERSION}/prebuilt/${BUILD_PLATFORM}
    CROSS_PREFIX=${TOOLCHAIN}/bin/$4-

    # build 中間件
        BUILD_DIR=./${MY_BUILD_DIR}/${ANDROID_ARCH_ABI}

    echo "pwd==$(pwd)"
    echo "ARCH==${ARCH}"
    echo "PREFIX==${PREFIX}"
    echo "HOST==${HOST}"
    echo "SYSROOT=${SYSROOT}"
    echo "CFALGS=$5"
    echo "CFALGS=${CFALGS}"
    echo "TOOLCHAIN==${TOOLCHAIN}"
    echo "CROSS_PREFIX=${CROSS_PREFIX}"

    #echo "-------------------------按任意鍵繼續---------------------"
    #read -n 1
    #echo "-------------------------繼續執行-------------------------"

    mkdir -p ${BUILD_DIR}   #創建當前arch_abi的編譯目錄,比如:binary/armeabi-v7a
        cd ${BUILD_DIR}         #此處 進了當前arch_abi的2級編譯目錄


    sh  ${MY_DIR}/configure \
        --prefix=${PREFIX} \
        --target-os=linux \
        --arch=${ARCH} \
        --sysroot=$SYSROOT \
        --enable-cross-compile \
        --cross-prefix=${CROSS_PREFIX} \
        --extra-cflags="$CFALGS -Os -fPIC -DANDROID -Wfatal-errors -Wno-deprecated" \
        --extra-cxxflags="-D__thumb__ -fexceptions -frtti" \
        --extra-ldflags="-L${SYSROOT}/usr/lib" \
        --enable-shared \
        --enable-asm \
        --enable-neon \
        --disable-encoders \
        --enable-encoder=aac \
        --enable-encoder=mjpeg \
        --enable-encoder=png \
        --disable-decoders \
        --enable-decoder=aac \
        --enable-decoder=aac_latm \
        --enable-decoder=h264 \
        --enable-decoder=mpeg4 \
        --enable-decoder=mjpeg \
        --enable-decoder=png \
        --disable-demuxers \
        --enable-demuxer=image2 \
        --enable-demuxer=h264 \
        --enable-demuxer=aac \
        --disable-parsers \
        --enable-parser=aac \
        --enable-parser=ac3 \
        --enable-parser=h264 \
        --enable-gpl \
        --disable-doc \
        --disable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --disable-symver \
        --disable-debug \
        --enable-small


    make clean
    make
    make install

    #從當前arch_abi編譯目錄跳出,對應上面的cd ${BUILD_DIR},以便function多次執行
        cd ../../

    echo "-------------------$2 build end-------------------------"
}


# build armeabi
build_bin arm armeabi arm-linux-androideabi arm-linux-androideabi "$ANDROID_ARMV5_CFLAGS"

#build armeabi-v7a
build_bin arm armeabi-v7a arm-linux-androideabi arm-linux-androideabi "$ANDROID_ARMV7_CFLAGS"

#build arm64-v8a
build_bin arm64 arm64-v8a aarch64-linux-android aarch64-linux-android "$ANDROID_ARMV8_CFLAGS"

#build x86
build_bin x86 x86 x86 i686-linux-android "$ANDROID_X86_CFLAGS"

#build x86_64
build_bin x86_64 x86_64 x86_64 x86_64-linux-android "$ANDROID_X86_64_CFLAGS"

5.修改configure文件
文件路徑 /home/用戶/ffmpeg-3.1.11/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)'

6.編譯最終生成所需要的文件
/home/用戶/ffmpeg-3.1.11/dist
資源下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章