ffplay android 编译,ffmpeg android 平台编译
? ? ?ffmpeg 在移動平臺上應用十分廣泛,其在音視頻編解碼,封裝多媒體文件格式,rtsp http rtmp協議相關的音視頻推流拉流具有強大的可用性。這里將自己平時為Android平臺編譯ffmpeg的用到的腳本分享出來,方便大家參考。本文編譯是在MAC電腦上完成的,當然Linux系統也可以。
? ?ffmpeg 編譯根據github上 WritingMinds/ffmpeg-android編譯腳本,進行了修改,添加arm64-v8a平臺的編譯,解決鏈接是出現的ELF格式不對錯誤,解決高版本的ndk工具編譯導致的鏈接錯誤。本文采用ffmpeg的版本3.0進行編譯成靜態庫,方便以后跟jni一起打包成動態庫,如果需要編譯成動態庫,只需要將 ffmpeg_build.sh 中 --disable-shared 編譯選項 改為?--enable-shared即可。注意:與JNI其它代碼一起封裝成動態庫是 鏈接ffmpeg靜態庫的順序也很重要,如果出現順序不對可能導致鏈接不成功。
? ?編譯腳本分為4個sh文件android_build.sh settings.sh abi_settings.sh ffmpeg_build.sh。在進行ffmpeg編譯時只需要運行./android_build.sh 即可完成arm64-v8a armeabi-v7a編譯
android_build.sh?
#!/bin/bash
# 執行編譯時,運行./android_build.sh即可
# 首先執行 settings.sh 腳本 完成基礎環境配置
. settings.sh
BASEDIR=$(pwd)
TOOLCHAIN_PREFIX=${BASEDIR}/toolchain-android
# Applying required patches
patch -p0 -N --dry-run --silent -f fontconfig/src/fcxml.c < android_donot_use_lconv.patch 1>/dev/null
if [ $? -eq 0 ]; then
patch -p0 -f fontconfig/src/fcxml.c < android_donot_use_lconv.patch
fi
# 根據settings.sh 定義需要平臺的cpu類型進行分別編譯
for i in "${SUPPORTED_ARCHITECTURES[@]}"
do
rm -rf ${TOOLCHAIN_PREFIX}
# $1 = architecture
# $2 = base directory
# $3 = pass 1 if you want to export default compiler environment variables
#./x264_build.sh $i $BASEDIR 0 || exit 1
#./libpng_build.sh $i $BASEDIR 1 || exit 1
#./freetype_build.sh $i $BASEDIR 1 || exit 1
#./expat_build.sh $i $BASEDIR 1 || exit 1
#./fribidi_build.sh $i $BASEDIR 1 || exit 1
#./fontconfig_build.sh $i $BASEDIR 1 || exit 1
#./libass_build.sh $i $BASEDIR 1 || exit 1
#./lame_build.sh $i $BASEDIR 1 || exit 1
./ffmpeg_build.sh $i $BASEDIR 0 || exit 1
done
rm -rf ${TOOLCHAIN_PREFIX}
settings.sh
#!/bin/bash
# 定義Android NDK目錄 測試使用的NDK版本為17
ANDROID_NDK=/Users/who/Library/Android/ndk-bundle
# 需要的eabi類型,一般有arm32位和 arm64位即可滿足大部分的需求
SUPPORTED_ARCHITECTURES=(arm64-v8a armeabi-v7a)
#SUPPORTED_ARCHITECTURES=(arm64-v8a armeabi-v7a armeabi-v7a-neon x86)
ANDROID_NDK_ROOT_PATH=${ANDROID_NDK}
if [[ -z "$ANDROID_NDK_ROOT_PATH" ]]; then
echo "You need to set ANDROID_NDK environment variable, please check instructions"
exit
fi
# 定義支持的Android版本,此處最小支持到21,即Android5.0
ANDROID_API_VERSION=21
NDK_TOOLCHAIN_ABI_VERSION=4.9
NUMBER_OF_CORES=$(nproc)
HOST_UNAME=$(uname -m)
TARGET_OS=android
# 此處定義編譯選項,在原文基礎上添加-D__ANDROID_API__=21,解決在高版本的NDK編譯過程中出現鏈接錯誤的問題
CFLAGS='-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all -D__ANDROID_API__=21'
LDFLAGS='-Wl,-z,relro -Wl,-z,now -pie'
FFMPEG_PKG_CONFIG="$(pwd)/ffmpeg-pkg-config"
? ?abi_settings.sh
#!/bin/bash
. settings.sh
BASEDIR=$2
case $1 in
armeabi-v7a)
NDK_ABI='arm'
NDK_TOOLCHAIN_ABI='arm-linux-androideabi'
NDK_CROSS_PREFIX="${NDK_TOOLCHAIN_ABI}"
;;
armeabi-v7a-neon)
NDK_ABI='arm'
NDK_TOOLCHAIN_ABI='arm-linux-androideabi'
NDK_CROSS_PREFIX="${NDK_TOOLCHAIN_ABI}"
CFLAGS="${CFLAGS} -mfpu=neon"
;;
arm64-v8a)
NDK_ABI='arm64'
NDK_TOOLCHAIN_ABI='aarch64-linux-android'
NDK_CROSS_PREFIX="${NDK_TOOLCHAIN_ABI}"
;;
x86)
NDK_ABI='x86'
NDK_TOOLCHAIN_ABI='x86'
NDK_CROSS_PREFIX="i686-linux-android"
CFLAGS="$CFLAGS -march=i686"
;;
esac
TOOLCHAIN_PREFIX=${BASEDIR}/toolchain-android
if [ ! -d "$TOOLCHAIN_PREFIX" ]; then
${ANDROID_NDK_ROOT_PATH}/build/tools/make-standalone-toolchain.sh --toolchain=${NDK_TOOLCHAIN_ABI}-${NDK_TOOLCHAIN_ABI_VERSION} --platform=android-${ANDROID_API_VERSION} --install-dir=${TOOLCHAIN_PREFIX}
fi
CROSS_PREFIX=${TOOLCHAIN_PREFIX}/bin/${NDK_CROSS_PREFIX}-
NDK_SYSROOT=${TOOLCHAIN_PREFIX}/sysroot
ffmpeg_build.sh
#!/bin/bash
. abi_settings.sh $1 $2 $3
pushd ffmpeg
# 添加這兩行 刪除stdtod.d stdtod.o這兩個文件,否則導致鏈接錯誤
rm -rf compat/strtod.d
rm -rf compat/strtod.o
# 在原有基礎上添加 arm64-v8a 平臺
case $1 in
armeabi-v7a | armeabi-v7a-neon)
CPU='cortex-a8'
;;
arm64-v8a)
CPU='armv8-a'
;;
x86)
CPU='i686'
;;
esac
make clean
./configure \n--target-os="$TARGET_OS" \n--cross-prefix="$CROSS_PREFIX" \n--arch="$NDK_ABI" \n--cpu="$CPU" \n--enable-runtime-cpudetect \n--sysroot="$NDK_SYSROOT" \n--enable-pic \n--enable-pthreads \n--disable-debug \n--enable-version3 \n--enable-hardcoded-tables \n--disable-ffplay \n--disable-ffprobe \n--disable-ffserver \n--disable-ffmpeg \n--enable-gpl \n--enable-yasm \n--disable-doc \n--disable-shared \n--enable-static \n--pkg-config="${2}/ffmpeg-pkg-config" \n--prefix="${2}/build/${1}" \n--extra-cflags="-I${TOOLCHAIN_PREFIX}/include $CFLAGS" \n--extra-ldflags="-L${TOOLCHAIN_PREFIX}/lib $LDFLAGS" \n--extra-cxxflags="$CXX_FLAGS" || exit 1
make -j4 && make install || exit 1
popd
?
總結
以上是生活随笔為你收集整理的ffplay android 编译,ffmpeg android 平台编译的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 股票做t的方法和技巧
- 下一篇: 公积金怎么自己封存
