ffmpeg 编译Android
2024-10-09 13:33:02
环境 macOS 10.15.4 NDK 21.3.6528147 ffmpeg 4.2.3
1.执行sudo xcodebuild -license,防止编译的时候找不到一些文件报错
2.下载ffmpeg(4.2.3),解压后进入主目录,修改configure文件,找到
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)'
3.下载NDK,我这里直接在Android Studio上下载,路径在~/Library/Android/sdk/ndk/21.3.6528147 ,将NDK路径加入path
编辑~/.bash_profile:
NDK_HOME=~/Library/Android/sdk/ndk/21.3.
PATH=${PATH}:${NDK_HOME} export PATH
export NDK_HOME
执行source ~/.bash_profile,使得路径实时生效
编译脚本android_llvm.sh
#!/bin/sh
# 测试通过 sh android_llvm.sh armv8-a sh android_llvm.sh armv7a sh android_llvm.sh i686 sh android_llvm.sh x86-64 NDK=${NDK_HOME}
ANDROID_API=29
# armv8-a armv7a aarch64 i686 x86_64
CPU=armv8-a
# arm aarch64 i686 x86_64
ARCH=arm64
PLATFORM=darwin-x86_64
TOOLCHAIN=${NDK}/toolchains/llvm/prebuilt/${PLATFORM} #OPTIMIZE_CFLAGS="-march=$CPU"
if [ "$#" -lt 1 ]; then
CPU=armv8-a
else
CPU=$(tr [A-Z] [a-z] <<< "$1")
fi
case ${CPU} in
arm|armv5|armv6|armv7|armeabi)
echo ${CPU}
;;
armv7a|armeabi-v7a)
ARCH=arm
CC=${TOOLCHAIN}/bin/armv7a-linux-androideabi${ANDROID_API}-clang
CXX=${TOOLCHAIN}/bin/armv7a-linux-androideabi${ANDROID_API}-clang++
CROSS_PREFIX=${TOOLCHAIN}/bin/arm-linux-androideabi-
TOOLNAME_BASE=arm-linux-androideabi
;;
hard|armv7a-hard|armeabi-v7a-hard)
echo ${CPU}
;;
neon|armv7a-neon)
;;
armv8|armv8-a|aarch64|arm64|arm64-v8a)
# 验证成功
ARCH=arm64
CC=${TOOLCHAIN}/bin/aarch64-linux-android${ANDROID_API}-clang
CXX=${TOOLCHAIN}/bin/aarch64-linux-android${ANDROID_API}-clang++
CROSS_PREFIX=${TOOLCHAIN}/bin/aarch64-linux-android-
TOOLNAME_BASE=aarch64-linux-android
;;
mips|mipsel)
echo ${CPU}
;;
mips64|mipsel64|mips64el)
echo ${CPU}
;;
i686)
ARCH=x86
CC=${TOOLCHAIN}/bin/i686-linux-android${ANDROID_API}-clang
CXX=${TOOLCHAIN}/bin/i686-linux-android${ANDROID_API}-clang++
CROSS_PREFIX=${TOOLCHAIN}/bin/i686-linux-android-
TOOLNAME_BASE=i686-linux-android
;;
x86-64|x64)
ARCH=x86_64
CC=${TOOLCHAIN}/bin/x86_64-linux-android${ANDROID_API}-clang
CXX=${TOOLCHAIN}/bin/x86_64-linux-android${ANDROID_API}-clang++
CROSS_PREFIX=${TOOLCHAIN}/bin/x86_64-linux-android-
TOOLNAME_BASE=x86_64-linux-android
;;
esac
echo "CPU:${CPU}"
echo "ARCH:${ARCH}"
# mac下是darwin-x86_64,Windows是windows-x86_64 #TARGET=${CPU}-linux-androideabi
PREFIX=$(pwd)/android/$CPU
SYSROOT=${TOOLCHAIN}/sysroot
PREFIX=$(pwd)/android/$CPU
CFFLAGS="-Os -fpic -march=${CPU}"
LDFLAGS="-marm" #--prefix : 安装目录
#--enable-small : 优化大小
#--disable-programs : 不编译ffmpeg程序(命令行工具),我们是需要获得静态(动态)库。
#--disable-avdevice : 关闭avdevice模块,此模块在android中无用
#--disable-encoders : 关闭所有编码器 (播放不需要编码)
#--disable-muxers : 关闭所有复用器(封装器),不需要生成mp4这样的文件,所以关闭
#--disable-filters :关闭视频滤镜
#--enable-cross-compile : 开启交叉编译(ffmpeg比较**跨平台**,并不是所有库都有这么happy的选项 )
#--cross-prefix: 看右边的值应该就知道是干嘛的,gcc的前缀 xxx/xxx/xxx-gcc 则给xxx/xxx/xxx-
#disable-shared enable-static 不写也可以,默认就是这样的。
#--sysroot:
#--extra-cflags: 会传给gcc的参数
#--arch --target-os : 不给不行,为什么给这些值,见视频 function build_android
{
./configure \
--prefix=${PREFIX} \
--cross-prefix=${CROSS_PREFIX} \
--target-os=android \
--arch=${ARCH} \
--cpu=${CPU} \
--sysroot=${SYSROOT} \
--extra-cflags="-Os -fpic -march=${CPU}" \
--extra-ldflags=${LDFLAGS} \
--cc=${CC} \
--cxx=${CXX} \
--disable-doc \
--disable-ffplay \
--disable-ffprobe \
--disable-symver \
--disable-avdevice \
--disable-static \
--enable-ffmpeg \
--enable-cross-compile \
--enable-jni \
--enable-neon \
--enable-hwaccels \
--enable-gpl \
--enable-postproc \
--enable-shared \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
build_android #合并
#${CROSS_PREFIX}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 \
# ${PREFIX}/lib/libavcodec.a \
# ${PREFIX}/lib/libavfilter.a \
# ${PREFIX}/lib/libavresample.a \
# ${PREFIX}/lib/libswresample.a \
# ${PREFIX}/lib/libavformat.a \
# ${PREFIX}/lib/libavutil.a \
# ${PREFIX}/lib/libswscale.a \
# ${PREFIX}/lib/libpostproc.a \
# ${PREFIX}/lib/libavdevice.a \
# -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
# ${TOOLCHAIN}/lib/gcc/${TOOLNAME_BASE}/4.9.x/libgcc.a
常见编译问题:
1.nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.
升级yasm
2.
最新文章
- hdu 1030 Delta-wave (C++, 0ms, explanatory comments.) 分类: hdoj 2015-06-15 12:21 45人阅读 评论(0) 收藏
- nginx和apache下的url rewrite
- C# 带进度条的文件下载
- [OC Foundation框架 - 2] NSString 的创建
- 封装DB类
- spring mvc 自定义Handlermapping
- 【性能优化】优化笔记之一:图像RGB与YUV转换优化
- bash与sh的区别
- C语言得到当前系统时间
- CentOS 6.4 安装setuptools 和 pip
- javascript中event.clientX和event.clientY用法的注意事项
- cnblogs第一天
- 临时关闭Mac SIP系统完整性保护机制
- [转帖]Huge Page 是否是拯救性能的万能良药?
- Spark源码编译,官网学习
- 浅谈JavaScript函数重载
- leetcode239
- python 回溯法 子集树模板 系列 —— 16、爬楼梯
- 在ListView中嵌套ListView的事件处理
- RC1意思