FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,並能將其轉化爲流的開源計算機程序。採用LGPL或GPL許可證。它提供了錄製、轉換以及流化音視頻的完整解決方案。它包含了非常先進的音頻/視頻編解碼庫libavcodec,爲了保證高可移植性和編解碼質量,libavcodec裏很多code都是從頭開發的。
FFmpeg在Linux平臺下開發,但它同樣也可以在其它操作系統環境中編譯運行,包括Windows、Mac OS X等。
首先下載Ffmpeg 源碼:
我下載的是 4.2.2 最新;
請注意,不同的版本,編譯可能會遇到不同的問題;
NDK 環境 android-ndk-r17c
下載:https://developer.android.google.cn/ndk/downloads/
三、配置NDK環境變量
-
1.在命令行中輸入
vim ~/.bash_profile
-
2.添加NDK環境
-
#NDK_ROOT換成自己NDK路徑 export NDK_ROOT=/Users/Android/android-ndk-r17c export PATH=${PATH}:${NDK_ROOT}
四、修改Ffmpeg 目錄下configure文件
用vim打開,用命令行
/
查找SLIBNAME_WITH_MAJOR
以快速定位
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)'
五. 編寫build_android.sh
在ffmpeg解壓後的文件夾下,新建文件 build_andriod.sh
#!/bin/bash
ADDI_CFLAGS="-marm"
API=19
PLATFORM=arm-linux-androideabi
CPU=x86_64 # 'armeabi-v7a' 'x86_64'
NDK=/Users/xxx/android/android-ndk-r17c # 修改成自己本地的ndk路徑。
SYSROOT=$NDK/platforms/android-$API/arch-arm/
ISYSROOT=$NDK/sysroot
ASM=$ISYSROOT/usr/include/$PLATFORM
TOOLCHAIN=$NDK/toolchains/$PLATFORM-4.9/prebuilt/darwin-x86_64
export TMPDIR=$(pwd)/tmp
OUTPUT=$(pwd)/android/$CPU #自己指定一個輸出目錄,用來放生成的文件的。
function build
{
echo "開始編譯ffmpeg"
./configure \
--prefix=$OUTPUT \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=android \
--arch=armeabi-v7a \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-I$ASM -isysroot $ISYSROOT -Os -fpic -marm" \
--extra-ldflags="-marm" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
# 這裏是定義用幾個CPU編譯,我用4個,一般在5分鐘之內編譯完成
make -j4
make install
echo "編譯結束!"
}
build
六. 編譯
打開終端,進入 Ffmpeg 目錄下,ls -l build_android.sh這個命令查看到當前文件沒有可執行權限,添加權限chmod a+x build_android.sh
運行當前文件./build_android.sh
編譯編譯成功後,生成三個文件夾分別爲include(頭文件)、lib(.so動態庫)、share
七. 遇到問題:
arm-linux-androideabi-clang is unable to create an executable
打開相應目錄,果真不存在,不過這個一看就知道是更高版本纔會有的,Android 默認是 clang ,不再是gcc
解決方案:
修改Ffmpeg 目錄下configure文件
4210 行 clang 改爲 gcc
set_default target_os
if test "$target_os" = android; then
cc_default="clang"
fi
編譯成功;
多架構 方案腳本 需要添加NDK位置(未驗證)
#!/bin/sh
PREFIX=android-build
HOST_PLATFORM=linux-x86_64
COMMON_OPTIONS="\
--target-os=android \
--disable-static \
--enable-shared \
--enable-small \
--disable-programs \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-doc \
--disable-symver \
--disable-asm \
--enable-decoder=vorbis \
--enable-decoder=opus \
--enable-decoder=flac
"
build_all(){
for version in armeabi-v7a arm64-v8a x86 x86_64; do
echo "======== > Start build $version"
case ${version} in
armeabi-v7a )
ARCH="arm"
CPU="armv7-a"
CROSS_PREFIX="$NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/$HOST_PLATFORM/bin/arm-linux-androideabi-"
SYSROOT="$NDK_HOME/platforms/android-21/arch-arm/"
EXTRA_CFLAGS="-march=armv7-a -mfpu=neon -mfloat-abi=softfp -mvectorize-with-neon-quad"
EXTRA_LDFLAGS="-Wl,--fix-cortex-a8"
;;
arm64-v8a )
ARCH="aarch64"
CPU="armv8-a"
CROSS_PREFIX="$NDK_HOME/toolchains/aarch64-linux-android-4.9/prebuilt/$HOST_PLATFORM/bin/aarch64-linux-android-"
SYSROOT="$NDK_HOME/platforms/android-21/arch-arm64/"
EXTRA_CFLAGS=""
EXTRA_LDFLAGS=""
;;
x86 )
ARCH="x86"
CPU="i686"
CROSS_PREFIX="$NDK_HOME/toolchains/x86-4.9/prebuilt/$HOST_PLATFORM/bin/i686-linux-android-"
SYSROOT="$NDK_HOME/platforms/android-21/arch-x86/"
EXTRA_CFLAGS=""
EXTRA_LDFLAGS=""
;;
x86_64 )
ARCH="x86_64"
CPU="x86_64"
CROSS_PREFIX="$NDK_HOME/toolchains/x86_64-4.9/prebuilt/$HOST_PLATFORM/bin/x86_64-linux-android-"
SYSROOT="$NDK_HOME/platforms/android-21/arch-x86_64/"
EXTRA_CFLAGS=""
EXTRA_LDFLAGS=""
;;
esac
echo "-------- > Start clean workspace"
make clean
echo "-------- > Start config makefile"
configuration="\
--prefix=${PREFIX} \
--libdir=${PREFIX}/libs/${version}
--incdir=${PREFIX}/includes/${version} \
--pkgconfigdir=${PREFIX}/pkgconfig/${version} \
--arch=${ARCH} \
--cpu=${CPU} \
--cross-prefix=${CROSS_PREFIX} \
--sysroot=${SYSROOT} \
--extra-ldexeflags=-pie \
${COMMON_OPTIONS}
"
echo "-------- > Start config makefile with ${configuration}"
./configure ${configuration}
echo "-------- > Start make ${version} with -j8"
make j8
echo "-------- > Start install ${version}"
make install
echo "++++++++ > make and install ${version} complete."
done
}
echo "-------- Start --------"
build_all
echo "-------- End --------"
參考: