NDK交叉編譯FFmpeg安卓編譯ffmpeg
編譯環(huán)境
編譯工具下載
參考這個:https://blog.csdn.net/gaoliang0/article/details/81913291
或者官網(wǎng) NDK編譯工具下載: https://developer.android.google.cn/ndk/downloads?hl=zh-cn
官網(wǎng)老版本: https://github.com/android/ndk/wiki/Unsupported-Downloads
或者從我的百度網(wǎng)盤:
鏈接:https://pan.baidu.com/s/1FEtM6mVNgER_DvC2myHB5Q?pwd=28l9
提取碼:28l9
–來自百度網(wǎng)盤超級會員V6的分享
準(zhǔn)備下載 android-ndk-r19c-linux-x86_64.zip 因?yàn)檫@個版本比較適中
編譯過程
編譯環(huán)境
系統(tǒng)環(huán)境
系統(tǒng)環(huán)境:
iyfangfeng@iyfangfeng:~/libsrc/ffmpeg/basic/clangffmpeg0511$ uname -a
Linux iyfangfeng 5.4.0-150-generic #167~18.04.1-Ubuntu SMP Wed May 24 00:51:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
NDK版本:
/home/iyfangfeng/libsrc/tools/android-ndk-r19c
以下只編譯armeabi-v7a版本如果需要編譯其他版本 可以參考 build_fdkaac_all.sh 方式
NDK版本的選擇
當(dāng)前Google給的NDK工具支持GCC最高版本android-ndk-r17c-linux-x86_64.zip之后的版本不再支持gcc,只支持clang來編譯,而使用gcc或者clang編譯在編譯腳本上存在差別,所以需要注意著點(diǎn)。
選擇哪個版本取決于使用的編譯腳本。
下面的ffmpeg因?yàn)樯婕暗胶芏嗟谌綆焖詴嬖谕瑫r使用r17c以上的版本或者r17c下的版本 使用gcc編譯。
注意:
如果遇到一些奇怪的問題可以換一換NDK版本時候,有時候就解決了,或者更多的使用自己經(jīng)常使用的版本,比如我用的多是android-ndk-r10e環(huán)境來適應(yīng)gcc編譯環(huán)境,問題少很多。
-
本地NDK編譯器目錄參考
iyfangfeng@iyfangfeng:~/libsrc/tools$ ls android-ndk-r10e android-ndk-r10e-linux-x86_64.zip android-ndk-r16b android-ndk-r16b-linux-x86_64.zip android-ndk-r19c android-ndk-r19c-linux-x86_64.zip iyfangfeng@iyfangfeng:~/libsrc/tools$
源碼下載
ffmpeg-3.3.8.tar.gz
-
ffmpeg 下載
https://gitee.com/mirrors/ffmpeg/tags?page=4
http://ffmpeg.org/download.html#releases
只編譯簡單的ffmpeg
編譯
iyfangfeng@iyfangfeng:~/libsrc/ffmpeg/basic/clangffmpeg0511$ ./build_ffmpeg.sh armeabi-v7a
iyfangfeng@iyfangfeng:~/libsrc/ffmpeg/basic/clangffmpeg0511$ ls libs/lib-ffmpeg/armeabi-v7a/lib/
libavcodec.so libavdevice.so libavfilter.so libavformat.so libavutil.so libpostproc.so libswresample.so libswscale.so pkgconfig
./build_ffmpeg.sh 使用的是gcc 編譯腳本
編譯腳本
-
最簡單的目錄結(jié)構(gòu)
iyfangfeng@iyfangfeng:~/libsrc/ffmpeg/basic/clangffmpeg0511$ ls build_ffmpeg.sh config.sh libs ffmpeg-3.3.8
-
build_ffmpeg.sh
iyfangfeng@iyfangfeng:~/libsrc/ffmpeg/basic/clangffmpeg0511$ cat build_ffmpeg.sh
#!/bin/bash
ARCH=$1
source config.sh $ARCH
LIBS_DIR=$(cd `dirname $0`; pwd)/libs/lib-ffmpeg
echo "LIBS_DIR="$LIBS_DIR
cd ffmpeg-3.3.8
PLATFORM=$ANDROID_NDK_ROOT/platforms/$AOSP_API/$AOSP_ARCH
TOOLCHAIN=$ANDROID_NDK_ROOT/toolchains/$TOOLCHAIN_BASE-$AOSP_TOOLCHAIN_SUFFIX/prebuilt/linux-x86_64
PREFIX=$LIBS_DIR/$AOSP_ABI
echo ===============================
echo $PREFIX
./configure \
--prefix=$PREFIX \
--enable-cross-compile \
--disable-runtime-cpudetect \
--disable-asm \
--arch=arm \
--target-os=android \
--cc=$TOOLCHAIN/bin/$TOOLNAME_BASE-gcc \
--cross-prefix=$TOOLCHAIN/bin/$TOOLNAME_BASE- \
--disable-stripping \
--nm=$TOOLCHAIN/bin/$TOOLNAME_BASE-nm \
--sysroot=$PLATFORM \
--enable-gpl \
--enable-shared \
--disable-static \
--enable-small \
--enable-postproc \
--enable-avdevice \
--disable-outdevs \
--disable-ffprobe \
--disable-ffplay \
--disable-ffmpeg \
--disable-ffserver \
--disable-debug \
--disable-ffprobe \
--disable-ffplay \
--disable-ffmpeg \
--disable-symver \
--disable-stripping \
--extra-cflags="$FF_EXTRA_CFLAGS $FF_CFLAGS" \
--extra-ldflags=" "
make clean
make -j8
make install
cd ..
-
config.sh
iyfangfeng@iyfangfeng:~/libsrc/ffmpeg/basic/clangffmpeg0511$ cat config.sh #NDK路徑 #clang ffmpeg #export ANDROID_NDK_ROOT=/home/yanglong/iyangfeng/tools/android-ndk-r19c #上面是之前電腦編譯路徑 #export ANDROID_NDK_ROOT=/home/iyfangfeng/libsrc/tools/android-ndk-r19c #clang #CXX gcc r17c 及其以下 #fdkaac x264 export ANDROID_NDK_ROOT=/home/iyfangfeng/libsrc/tools/android-ndk-r10e export AOSP_TOOLCHAIN_SUFFIX=4.9 export AOSP_API="android-21" #架構(gòu) if [ "$#" -lt 1 ]; then THE_ARCH=armv7 else THE_ARCH=$(tr [A-Z] [a-z] <<< "$1") fi #根據(jù)不同架構(gòu)配置環(huán)境變量 case "$THE_ARCH" in arm|armv5|armv6|armv7|armeabi) TOOLCHAIN_BASE="arm-linux-androideabi" TOOLNAME_BASE="arm-linux-androideabi" AOSP_ABI="armeabi" AOSP_ARCH="arch-arm" HOST="arm-linux-androideabi" AOSP_FLAGS="-march=armv5te -mtune=xscale -mthumb -msoft-float -funwind-tables -fexceptions -frtti" FF_EXTRA_CFLAGS="-O3 -fpic -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -finline-limit=300 -mfloat-abi=softfp -mfpu=vfp -marm -march=armv6 " FF_CFLAGS="-O3 -Wall -pipe -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID " ;; armv7a|armeabi-v7a) TOOLCHAIN_BASE="arm-linux-androideabi" TOOLNAME_BASE="arm-linux-androideabi" AOSP_ABI="armeabi-v7a" AOSP_ARCH="arch-arm" HOST="arm-linux-androideabi" AOSP_FLAGS="-march=armv7-a -mthumb -mfpu=vfpv3-d16 -mfloat-abi=softfp -Wl,--fix-cortex-a8 -funwind-tables -fexceptions -frtti " FF_EXTRA_CFLAGS="-DANDROID -fPIE -pipe -fPIC -ffunction-sections -funwind-tables -fstack-protector -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fomit-frame-pointer -fstrict-aliasing" FF_CFLAGS="-O3 -Wall -fPIE -pipe -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wa,--noexecstack -DANDROID " ;; hard|armv7a-hard|armeabi-v7a-hard) TOOLCHAIN_BASE="arm-linux-androideabi" TOOLNAME_BASE="arm-linux-androideabi" AOSP_ABI="armeabi-v7a" AOSP_ARCH="arch-arm" HOST="arm-linux-androideabi" AOSP_FLAGS="-mhard-float -D_NDK_MATH_NO_SOFTFP=1 -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -Wl,--fix-cortex-a8 -funwind-tables -fexceptions -frtti -Wl,--no-warn-mismatch -Wl,-lm_hard" FF_EXTRA_CFLAGS="-DANDROID -fPIC -ffunction-sections -funwind-tables -fstack-protector -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300 " FF_CFLAGS="-O3 -Wall -pipe -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID " ;; neon|armv7a-neon) TOOLCHAIN_BASE="arm-linux-androideabi" TOOLNAME_BASE="arm-linux-androideabi" AOSP_ABI="armeabi-v7a" AOSP_ARCH="arch-arm" HOST="arm-linux-androideabi" AOSP_FLAGS="-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -Wl,--fix-cortex-a8 -funwind-tables -fexceptions -frtti" FF_EXTRA_CFLAGS="-DANDROID -fPIC -ffunction-sections -funwind-tables -fstack-protector -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300 " FF_CFLAGS="-O3 -Wall -pipe -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID " ;; armv8|armv8a|aarch64|arm64|arm64-v8a) TOOLCHAIN_BASE="aarch64-linux-android" TOOLNAME_BASE="aarch64-linux-android" AOSP_ABI="arm64-v8a" AOSP_ARCH="arch-arm64" HOST="aarch64-linux" AOSP_FLAGS="-funwind-tables -fexceptions -frtti" FF_EXTRA_CFLAGS="" FF_CFLAGS="-O3 -Wall -pipe -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID " ;; mips|mipsel) TOOLCHAIN_BASE="mipsel-linux-android" TOOLNAME_BASE="mipsel-linux-android" AOSP_ABI="mips" AOSP_ARCH="arch-mips" HOST="mipsel-linux" AOSP_FLAGS="-funwind-tables -fexceptions -frtti" ;; mips64|mipsel64|mips64el) TOOLCHAIN_BASE="mips64el-linux-android" TOOLNAME_BASE="mips64el-linux-android" AOSP_ABI="mips64" AOSP_ARCH="arch-mips64" HOST="mipsel64-linux" AOSP_FLAGS="-funwind-tables -fexceptions -frtti" ;; x86) TOOLCHAIN_BASE="x86" TOOLNAME_BASE="i686-linux-android" AOSP_ABI="x86" AOSP_ARCH="arch-x86" HOST="i686-linux" AOSP_FLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -funwind-tables -fexceptions -frtti" FF_EXTRA_CFLAGS="-O3 -DANDROID -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -fomit-frame-pointer -march=k8 " FF_CFLAGS="-O3 -Wall -pipe -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID " ;; x86_64|x64) TOOLCHAIN_BASE="x86_64" TOOLNAME_BASE="x86_64-linux-android" AOSP_ABI="x86_64" AOSP_ARCH="arch-x86_64" HOST="x86_64-linux" AOSP_FLAGS="-march=x86-64 -msse4.2 -mpopcnt -mtune=intel -funwind-tables -fexceptions -frtti" FF_EXTRA_CFLAGS="-O3 -DANDROID -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -fomit-frame-pointer -march=k8 " FF_CFLAGS="-O3 -Wall -pipe -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID " ;; *) echo "ERROR: Unknown architecture $1" [ "$0" = "$BASH_SOURCE" ] && exit 1 || return 1 ;; esac echo "TOOLCHAIN_BASE="$TOOLCHAIN_BASE echo "TOOLNAME_BASE="$TOOLNAME_BASE echo "AOSP_ABI="$AOSP_ABI echo "AOSP_ARCH="$AOSP_ARCH echo "AOSP_FLAGS="$AOSP_FLAGS echo "HOST="$HOST
問題
- C compiler cannot create executables
checking whether the C compiler works... no
configure: error: in `/home/iyfangfeng/libsrc/ffmpeg/basic/clangffmpeg0511/fdk-aac-0.1.6':
configure: error: C compiler cannot create executables
See `config.log' for more details
解決:
之前使用的是clang ndk-r19c的編譯環(huán)境建議換成r10e或者r14 不能使用r16b 有問題
-
fatal error: stdio.h: No such file or directory
libSYS/src/cmdl_parser.cpp:96:19: fatal error: stdio.h: No such file or directory #include <stdio.h> ^ compilation terminated. Makefile:1270: recipe for target 'libSYS/src/cmdl_parser.lo' failed make: *** [libSYS/src/cmdl_parser.lo] Error 1 make: *** 正在等待未完成的任務(wù).... libSYS/src/genericStds.cpp:95:18: fatal error: math.h: No such file or directory
百度后說:改用ndk-r14b,因?yàn)閞16b目錄結(jié)構(gòu)改了。 這有可能,我換的是 r10e 這個之前用的最多 https://www.jianshu.com/p/38894c45daf0
確實(shí)編譯過了 遇到類似問題可以換版本試試 android-ndk-r10e
-
編譯器路徑一直都還是之前項(xiàng)目的
重新創(chuàng)建一個目錄,再下載一個版本 oK
-
Unknown option “–enalbe-demuxer=flv”.
Unknown option "--enalbe-demuxer=flv".
See ./configure --help for available options.
除了報錯這個外海包含其他的錯誤,可能是這個版本不支持flv 解復(fù)用,可以編譯選項(xiàng)中刪除掉
使用
可以在Android Studio 上面演示,暫時沒有完全獨(dú)立的demo,用得人多再補(bǔ)吧,先編譯文章來源:http://www.zghlxwxcb.cn/news/detail-719361.html
技術(shù)支持
按照如上提供的步驟,如果還存在問題,可以找我獲取可以使用的so庫、源碼、腳本、帶環(huán)境及源碼的虛擬機(jī)。應(yīng)該有地方可以獲取名片。promptpe文章來源地址http://www.zghlxwxcb.cn/news/detail-719361.html
到了這里,關(guān)于NDK交叉編譯FFmpeg安卓編譯ffmpeg的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!