1.Windows安装Oracle VM VirtualBox 7.0.10,安装ubuntu-22.04.3。
坑一:无法往虚拟机里拖放复制文件,解决办法:登录Ubuntu虚拟机时切换到xorg方式登录,参考地址:Ubuntu Desktop 22.04 无法实现拖放复制操作解决办法-CSDN博客
下载ndk25
官网下载:ndk官网
网盘下载:android-ndk-r25c-linux.zip注意,这是linux环境下的ndk。
下载FFmpeg 5.1.3
官网下载:FFmpeg官网
网盘下载:FFmpeg 5.1.3
解压文件:
-
- #解压ffmpeg-5.1.3.tar.xz
- tar -xf ffmpeg-5.1.3.tar.xz
-
- #解压android-ndk-r25c-linux.zip
- unzip android-ndk-r25c-linux.zip
-
ndk配置环境变量
配置环境变量命令:sudo gedit ~/.bashrc 注意:替换为你的ndk路径
- export NDK_HOME=/你的ndk路径/android-ndk-r25c
- export PATH=$NDK_HOME:$PATH
ndk-build查看配置环境变量成功没,只要没出command not found就证明环境变量配置成功,如果成功显示如下,
首先更新包列表:
sudo apt update
然后下载需要的编译软件
- sudo apt install autoconf \
- automake \
- build-essential \
- cmake \
- git-core \
- libass-dev \
- libfreetype6-dev \
- libgnutls28-dev \
- libmp3lame-dev \
- libsdl2-dev \
- libtool \
- libva-dev \
- libvdpau-dev \
- libvorbis-dev \
- libxcb1-dev \
- libxcb-shm0-dev \
- libxcb-xfixes0-dev \
- meson \
- ninja-build \
- pkg-config \
- texinfo \
- wget \
- yasm \
- zlib1g-dev \
- libunistring-dev \
- libaom-dev \
- libdav1d-dev \
- pkg-config
配置root用户
注意:编译的时候用root用户,我用普通用户编译失败
- $ sudo passwd root
- [sudo] password for dummy: # 此处需输入普通用户的登录密码
- New password: # 此处输入 root 用户的登录密码(新设置密码)
- Retype new password: # 此处再次输入 root 用户的登录密码(确认与上面的密码输入一致)
- passwd: password updated successfully
- $ su
- Password: # 此处输入上面设置的 root 用户登录密码,回车即可登录至 root 用户
- # exit # 退出登录 root 用户,回到普通用户登录态
-
到这一步编译所需的准备工作就做完了,接下来终于可以开始编译了。
修改FFmpeg的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)'
试运行configure文件:
进入FFmpeg源码根目录下,使用
sudo ./configure
成功运行了,接下来就可以开始筹备针对安卓平台的编译了。
在FFmpeg目录下新建build_android.sh,想了解详细配置参数请前往这里。
- # touch 新建文件
- [root@CentOS6 ffmpeg-5.1.3]# touch build_android.sh
- # vim 编辑build_android.sh
- [root@CentOS6 ffmpeg-5.1.3]# vim build_android.sh
写入脚本内容:
- #!/bin/bash
- #特别注意: 以下路径需要修改成自己Linux系统中的NDK目录!前面上传的ndk解压文件当中
- TOOLCHAIN=/usr/local/src/android-ndk-r25b/toolchains/llvm/prebuilt/linux-x86_64
- # 最低支持的android sdk版本
- API=21
- # --extra-cflags中添加'-DVK_ENABLE_BETA_EXTENSIONS=0', 防止引用vulkan_beta.h头文件
- function build_android
- {
- echo "Compiling FFmpeg for $CPU"
- ./configure \
- --prefix=$PREFIX \
- --disable-neon \
- --disable-hwaccels \
- --disable-gpl \
- --disable-postproc \
- --enable-shared \
- --enable-jni \
- --disable-mediacodec \
- --enable-small \
- --enable-gpl \
- --disable-decoder=h264_mediacodec \
- --disable-static \
- --disable-doc \
- --disable-programs \
- --disable-ffmpeg \
- --disable-ffplay \
- --disable-ffprobe \
- --disable-avdevice \
- --disable-symver \
- --cross-prefix=$CROSS_PREFIX \
- --target-os=android \
- --arch=$ARCH \
- --cpu=$CPU \
- --cc=$CC \
- --cxx=$CXX \
- --enable-cross-compile \
- --sysroot=$SYSROOT \
- --extra-cflags="-DVK_ENABLE_BETA_EXTENSIONS=0 -mno-stackrealign -Os -fpic $OPTIMIZE_CFLAGS" \
- --extra-ldflags="$ADDI_LDFLAGS" \
- $ADDITIONAL_CONFIGURE_FLAG
- make clean
- make -j4
- make install
- echo "The Compilation of FFmpeg for $CPU is completed"
- }
-
- #armv8-a
- ARCH=arm64
- CPU=armv8-a
- # r21版本的ndk中所有的编译器都在/toolchains/llvm/prebuilt/darwin-x86_64/目录下(clang)
- CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
- CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
- # NDK头文件环境
- SYSROOT=$TOOLCHAIN/sysroot
- CROSS_PREFIX=$TOOLCHAIN/bin/llvm-
- # so输出路径
- PREFIX=$(pwd)/android/$CPU
- OPTIMIZE_CFLAGS="-march=$CPU"
- build_android
-
- # 交叉编译工具目录,对应关系如下
- # armv8a -> arm64 -> aarch64-linux-android-
- # armv7a -> arm -> arm-linux-androideabi-
- # x86 -> x86 -> i686-linux-android-
- # x86_64 -> x86_64 -> x86_64-linux-android-
-
- # CPU架构
- #armv7-a
- ARCH=arm
- CPU=armv7-a
- CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
- CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
- SYSROOT=$TOOLCHAIN/sysroot
- CROSS_PREFIX=$TOOLCHAIN/bin/llvm-
- PREFIX=$(pwd)/android/$CPU
- OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
- build_android
-
- # #x86
- # ARCH=x86
- # CPU=x86
- # CC=$TOOLCHAIN/bin/i686-linux-android$API-clang
- # CXX=$TOOLCHAIN/bin/i686-linux-android$API-clang++
- # SYSROOT=$TOOLCHAIN/sysroot
- # CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android-
- # PREFIX=$(pwd)/android/$CPU
- # OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
- # build_android
-
- # #x86_64
- # ARCH=x86_64
- # CPU=x86-64
- # CC=$TOOLCHAIN/bin/x86_64-linux-android$API-clang
- # CXX=$TOOLCHAIN/bin/x86_64-linux-android$API-clang++
- # SYSROOT=$TOOLCHAIN/sysroot
- # CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-
- # PREFIX=$(pwd)/android/$CPU
- # OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 -mtune=intel"
- # 方法调用
- # build_android
-
赋权限755
在FFmpeg目录下的ffbuild目录中,将图中sh文件权限改为755,否则编译过程中可能报错无权限执行该文件。build_android.sh文件也赋权一下。
chmod 755 build_android.sh
./ build_android.sh编译成功,可以看到已经生成了.so动态库文件。
坑二:最后强调:赋权限和执行build_android.sh 都使用root用户,我普通用户编了半天也不成功。
参考连接:
FFmpeg5.1.3编译动态库详细教程(基于Linux虚拟机)-CSDN博客
【Android音视频开发】FFmpeg库编译详解(2022最新版)_android 编译ffmpeg_JesseAndroid的博客-CSDN博客