日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ffplay android 编译,ffmpeg android 平台编译

發(fā)布時間:2023/12/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ffplay android 编译,ffmpeg android 平台编译 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? ? ?ffmpeg 在移動平臺上應(yīng)用十分廣泛,其在音視頻編解碼,封裝多媒體文件格式,rtsp http rtmp協(xié)議相關(guān)的音視頻推流拉流具有強(qiáng)大的可用性。這里將自己平時為Android平臺編譯ffmpeg的用到的腳本分享出來,方便大家參考。本文編譯是在MAC電腦上完成的,當(dāng)然Linux系統(tǒng)也可以。

? ?ffmpeg 編譯根據(jù)github上 WritingMinds/ffmpeg-android編譯腳本,進(jìn)行了修改,添加arm64-v8a平臺的編譯,解決鏈接是出現(xiàn)的ELF格式不對錯誤,解決高版本的ndk工具編譯導(dǎo)致的鏈接錯誤。本文采用ffmpeg的版本3.0進(jìn)行編譯成靜態(tài)庫,方便以后跟jni一起打包成動態(tài)庫,如果需要編譯成動態(tài)庫,只需要將 ffmpeg_build.sh 中 --disable-shared 編譯選項(xiàng) 改為?--enable-shared即可。注意:與JNI其它代碼一起封裝成動態(tài)庫是 鏈接ffmpeg靜態(tài)庫的順序也很重要,如果出現(xiàn)順序不對可能導(dǎo)致鏈接不成功。

? ?編譯腳本分為4個sh文件android_build.sh settings.sh abi_settings.sh ffmpeg_build.sh。在進(jìn)行ffmpeg編譯時只需要運(yùn)行./android_build.sh 即可完成arm64-v8a armeabi-v7a編譯

android_build.sh?

#!/bin/bash

# 執(zhí)行編譯時,運(yùn)行./android_build.sh即可

# 首先執(zhí)行 settings.sh 腳本 完成基礎(chǔ)環(huán)境配置

. 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

# 根據(jù)settings.sh 定義需要平臺的cpu類型進(jìn)行分別編譯

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

# 此處定義編譯選項(xiàng),在原文基礎(chǔ)上添加-D__ANDROID_API__=21,解決在高版本的NDK編譯過程中出現(xiàn)鏈接錯誤的問題

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這兩個文件,否則導(dǎo)致鏈接錯誤

rm -rf compat/strtod.d

rm -rf compat/strtod.o

# 在原有基礎(chǔ)上添加 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

?

總結(jié)

以上是生活随笔為你收集整理的ffplay android 编译,ffmpeg android 平台编译的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。