我是靠谱客的博主 忐忑裙子,最近开发中收集的这篇文章主要介绍FFmpeg4.1编译ndk环境要保存动态库的目录,这里保存在源码根目录下的android/armv7-a编译配置详解答设置编译针对的系统,网上查到很多资料说编译前需要修改configure文件,设置这项后就不用修改了,系统会自动修改,效果一样。编译后文件的输出目录编译动态库,shared和static的开关是相对的。生成文档,以及相关的功能模块禁止编译可执行文件设置交叉编译器,按照实际路径修改就可以了。设置编译器,不然会报错,系统默认会使用arm-linux-androideabi-clang,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前言
本文介绍ffmpeg最新版4.1在mac的编译为android的方法跟说明,编译多个so打包为libffmpeg.so。
编译流程
下载FFMpeg源代码地址:
FFMpeg官网下载地址
github上FFmpeg的下载地址
准备好NDK
Android NDK 下载地址(推荐r17以下(包括r17c))
编写build for Android 脚本
在FFMpeg根目录新建sh文件,命名为:build_android.sh,复制脚本到build_android.sh, 内容如下:

ndk环境

export NDK=/Users/ali/Library/Android/android-ndk-r17c
export SYSROOT= N D K / p l a t f o r m s / a n d r o i d − 21 / a r c h − a r m e x p o r t T O O L C H A I N = NDK/platforms/android-21/arch-arm export TOOLCHAIN= NDK/platforms/android21/archarmexportTOOLCHAIN=NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
CPU=armv7-a

ISYSROOT= N D K / s y s r o o t A S M = NDK/sysroot ASM= NDK/sysrootASM=ISYSROOT/usr/include/arm-linux-androideabi

要保存动态库的目录,这里保存在源码根目录下的android/armv7-a

export PREFIX= ( p w d ) / a n d r o i d / (pwd)/android/ (pwd)/android/CPU
ADDI_CFLAGS="-marm"

编译配置详解答

设置编译针对的系统,网上查到很多资料说编译前需要修改configure文件,设置这项后就不用修改了,系统会自动修改,效果一样。

#–target-os=linux

编译后文件的输出目录

#–prefix=$PREFIX

#–enable-cross-compile

编译动态库,shared和static的开关是相对的。

#–enable-static
#–disable-shared

生成文档,以及相关的功能模块

#–disable-doc

禁止编译可执行文件

#–disable-programs
#–disable-ffmpeg
#–disable-ffplay
#–disable-ffprobe
#–disable-avdevice
#–disable-doc
#–disable-symver

设置交叉编译器,按照实际路径修改就可以了。

#–cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi-

设置编译器,不然会报错,系统默认会使用arm-linux-androideabi-clang,但是此编译器在NDK不存在,导致编译失败

#–cc=KaTeX parse error: Expected 'EOF', got ' ' at position 41: …ndroideabi-gcc ̲ ̲#--nm=TOOLCHAIN/bin/arm-linux-androideabi-nm

设置编译so库的架构,当前设置为arm,可以根据实际需求修改

#–arch=arm

设置编译针对的平台,可以根据实际需求进行设置,当前设置为最低支持android-21版本,arm架构。

#–sysroot=KaTeX parse error: Expected 'EOF', got ' ' at position 9: SYSROOT ̲ ̲#--extra-cflags…ASM -isysroot $ISYSROOT -D__ANDROID_API__=21 -U_FILE_OFFSET_BITS -Os -fPIC -DANDROID -Wno-deprecated -mfloat-abi=softfp -marm"

#–extra-ldflags="$ADDI_LDFLAGS"

$ADDITIONAL_CONFIGURE_FLAG

function build_android
{
echo -e “33[32m build start 33[0m”

./configure
–target-os=android
–prefix=KaTeX parse error: Expected 'EOF', got ' ' at position 8: PREFIX ̲ ̲ --enable…TOOLCHAIN/bin/arm-linux-androideabi-
–cc=KaTeX parse error: Expected 'EOF', got ' ' at position 41: …ndroideabi-gcc ̲ ̲ --nm=TOOLCHAIN/bin/arm-linux-androideabi-nm
–arch=arm
–sysroot=KaTeX parse error: Expected 'EOF', got ' ' at position 9: SYSROOT ̲ ̲ --extra-…ASM -isysroot KaTeX parse error: Expected group after '_' at position 12: ISYSROOT -D_̲_ANDROID_API__=…ADDI_LDFLAGS"
$ADDITIONAL_CONFIGURE_FLAG

make clean

make -j16
make install

echo -e “33[32m build successful 33[0m”
}

function merge
{
echo -e “33[32m package start 33[0m”

打包

KaTeX parse error: Expected 'EOF', got ' ' at position 40: …androideabi-ld ̲ ̲ -rpath-l…SYSROOT/usr/lib
-LKaTeX parse error: Expected 'EOF', got ' ' at position 17: …YSROOT/usr/lib ̲ ̲ -LPREFIX/lib
-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o
$PREFIX/libffmpeg.so
libavcodec/libavcodec.a
libavfilter/libavfilter.a
libavformat/libavformat.a
libavutil/libavutil.a
libswresample/libswresample.a
libswscale/libswscale.a
-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker
$TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a

strip 精简文件

$TOOLCHAIN/bin/arm-linux-androideabi-strip $PREFIX/libffmpeg.so

echo -e “33[32m package successful 33[0m”
}

build_android
merge

在Mac终端执行
./build_android.sh

相关流程说明
1、配置NDK相关环境
export NDK=/Users/ali/Library/Android/android-ndk-r17c
export SYSROOT= N D K / p l a t f o r m s / a n d r o i d − 21 / a r c h − a r m e x p o r t T O O L C H A I N = NDK/platforms/android-21/arch-arm export TOOLCHAIN= NDK/platforms/android21/archarmexportTOOLCHAIN=NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
CPU=armv7-a
ISYSROOT= N D K / s y s r o o t A S M = NDK/sysroot ASM= NDK/sysrootASM=ISYSROOT/usr/include/arm-linux-androideabi

2、配置configure
./configure
–target-os=android
–prefix=KaTeX parse error: Expected 'EOF', got ' ' at position 8: PREFIX ̲ ̲ --enabl…TOOLCHAIN/bin/arm-linux-androideabi-
–cc=KaTeX parse error: Expected 'EOF', got ' ' at position 41: …ndroideabi-gcc ̲ ̲ --nm=TOOLCHAIN/bin/arm-linux-androideabi-nm
–arch=arm
–sysroot=KaTeX parse error: Expected 'EOF', got ' ' at position 9: SYSROOT ̲ ̲ --extra…ASM -isysroot KaTeX parse error: Expected group after '_' at position 12: ISYSROOT -D_̲_ANDROID_API__=…ADDI_LDFLAGS"
$ADDITIONAL_CONFIGURE_FLAG
14_38_08__05_09_2019.jpg

14_39_06__05_09_2019.jpg

3、执行编译
make clean
make -j16
make install

4、执行打包
function merge
{
echo -e “33[32m package start 33[0m”

# 打包
$TOOLCHAIN/bin/arm-linux-androideabi-ld 
    -rpath-link=$SYSROOT/usr/lib 
    -L$SYSROOT/usr/lib 
    -L$PREFIX/lib 
    -soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o 
    $PREFIX/libffmpeg.so 
    libavcodec/libavcodec.a 
    libavfilter/libavfilter.a 
    libavformat/libavformat.a 
    libavutil/libavutil.a 
    libswresample/libswresample.a 
    libswscale/libswscale.a 
    -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker 
    $TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a

# strip 精简文件
$TOOLCHAIN/bin/arm-linux-androideabi-strip  $PREFIX/libffmpeg.so

echo -e "33[32m package successful 33[0m"

}

编译效果
如果大家编译效果一致,那么恭喜,编译成功,接下来就可以在Android平台上使用FFMpeg了;

14_38_08__05_09_2019.jpg

14_39_06__05_09_2019.jpg

思考&总结
1、关于修改configure,网上很多同学说需要修改configure,其实只要参数设置为–target-os=android,FFMpeg自动会处理文件路径相关问题;
修改前:
SLIBNAME_WITH_MAJOR=’ ( S L I B N A M E ) . (SLIBNAME). (SLIBNAME).(LIBMAJOR)’
LIB_INSTALL_EXTRA_CMD=’$ ( R A N L I B ) " (RANLIB) " (RANLIB)"(LIBDIR)/ ( L I B N A M E ) " ′ S L I B I N S T A L L N A M E = ′ (LIBNAME)"' SLIB_INSTALL_NAME=' (LIBNAME)"SLIBINSTALLNAME=(SLIBNAME_WITH_VERSION)’
SLIB_INSTALL_LINKS=’$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)’

修改后:
SLIBNAME_WITH_MAJOR=’ ( S L I B P R E F ) (SLIBPREF) (SLIBPREF)(FULLNAME)- ( L I B M A J O R ) (LIBMAJOR) (LIBMAJOR)(SLIBSUF)’
LIB_INSTALL_EXTRA_CMD=’$ ( R A N L I B ) " (RANLIB) " (RANLIB)"(LIBDIR)/ ( L I B N A M E ) " ′ S L I B I N S T A L L N A M E = ′ (LIBNAME)"' SLIB_INSTALL_NAME=' (LIBNAME)"SLIBINSTALLNAME=(SLIBNAME_WITH_MAJOR)’
SLIB_INSTALL_LINKS=’$(SLIBNAME)’

2、NDK17需要指定编译器,不然系统默认会使用arm-linux-androideabi-clang,但是此编译器在NDK不存在,导致编译失败
–cc=KaTeX parse error: Expected 'EOF', got ' ' at position 41: …ndroideabi-gcc ̲ ̲ --nm=TOOLCHAIN/bin/arm-linux-androideabi-nm

3、pkg-config not found,是编译过程中缺少pkg-config依赖,安装即可
在终端执行:
brew install pkg-config

4、其他一些编译错误,在mac上需要安装XCode,brewhome等环境
Xcode直接在apple官网或者App Store查找安装即可
brewhome可执行下面命令安装,命令会自动更新brew以及相关依赖
brew install automake fdk-aac git libtool libvorbis libvpx opus sdl shtool yasm texi2html theora wget x264 xvid lame libass

5、查看FFMpeg的版信息,打开版本信息所在文件–RELEASE
6、FFMpeg涉及面很广也深,刚开始接触只是初窥,后续还需要持续学习与实践才能逐步掌握,过程需要耐心]
参考
ffmpeg-compile-shared-library-for-android
FFmpeg之一编译ForAndroid

最后

以上就是忐忑裙子为你收集整理的FFmpeg4.1编译ndk环境要保存动态库的目录,这里保存在源码根目录下的android/armv7-a编译配置详解答设置编译针对的系统,网上查到很多资料说编译前需要修改configure文件,设置这项后就不用修改了,系统会自动修改,效果一样。编译后文件的输出目录编译动态库,shared和static的开关是相对的。生成文档,以及相关的功能模块禁止编译可执行文件设置交叉编译器,按照实际路径修改就可以了。设置编译器,不然会报错,系统默认会使用arm-linux-androideabi-clang的全部内容,希望文章能够帮你解决FFmpeg4.1编译ndk环境要保存动态库的目录,这里保存在源码根目录下的android/armv7-a编译配置详解答设置编译针对的系统,网上查到很多资料说编译前需要修改configure文件,设置这项后就不用修改了,系统会自动修改,效果一样。编译后文件的输出目录编译动态库,shared和static的开关是相对的。生成文档,以及相关的功能模块禁止编译可执行文件设置交叉编译器,按照实际路径修改就可以了。设置编译器,不然会报错,系统默认会使用arm-linux-androideabi-clang所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(80)

评论列表共有 0 条评论

立即
投稿
返回
顶部