NDK编译FFmpeg-4.1.4 & JNI部署

目录

  • NDK编译FFmpeg-4.1.4 & JNI部署
    • FFmpeg编译
      • 1. 下载FFmpeg
      • 2. 安装NDK
      • 3. 配置编译选项
      • 4. 编译
    • JNI部署

NDK编译FFmpeg-4.1.4 & JNI部署

任务: NDK编译FFmpeg,实现m4a音频文件的编解码方法,并利用jni部署到安卓端。

相关工具:

  • Android-ndk-r14b
  • FFmpeg-4.1.4
  • Android studio 3.4.3
  • macOS 10.14.6

FFmpeg编译

1. 下载FFmpeg

下载并解压FFmpeg-4.1.4
http://ffmpeg.org/download.html#releases

2. 安装NDK

  1. 下载并解压android-ndk-r14b
    https://developer.android.google.cn/ndk/downloads/older_releases.html
  • 很多错误都是因为NDK版本引起的,r17c和r20都有尝试,但还是r14b稳定;
  • 解压后的NDK可以放在Android studio的Android/sdk/ndk文件夹中,方便管理不同的版本;
  1. 配置NDK的路径,macOS修改.bash_profile,Linux修改.bashrc,末尾加入:
export ANDROID_NDK_ROOT=/Users/zhaozechuan/Library/Android/sdk/ndk/android-ndk-r14b
export PATH=$PATH:$ANDROID_NDK_ROOT
  1. 使NDK路径的修改生效:
    source .bash_profile

3. 配置编译选项

ffmpeg-4.1.4文件夹中新建build_android.sh文件,写入编译配置。

#!/bin/bash
make clean
export NDK=/Users/zhaozechuan/Library/Android/sdk/ndk/android-ndk-r14b
# 设置你的android平台编译器的版本 这里采用Android4.0 
export SYSROOT=$NDK/platforms/android-16/arch-arm/
#编译使用的toolchain
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
export CPU=armv7-a
# 这个是输出的路径
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"
./configure --target-os=linux \
--prefix=$PREFIX --arch=arm \
--disable-doc \
--disable-programs \
--disable-avdevice \
--disable-postproc \
--disable-avfilter \
--disable-decoders \
--enable-decoder=aac \
--disable-encoders \
--enable-encoder=aac \
--disable-hwaccels \
--disable-parsers \
--disable-bsfs \
--disable-protocols \
--disable-indevs \
--disable-outdevs \
--disable-filters \
--enable-protocol=file \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make -j16
make install
  • macOS的toolchaindarwin-x86_64,Linux的为linux-x86_64;
  • CPU的不同指的是目标平台的CPU架构的不同,比如armeabi-v7a是大多数手机的架构,用模拟器的话则是x86的架构,这个要对应上。其他CPU版本的编译可以参考这篇博客,它这个脚本在Linux下没问题,macOS我没花时间去跑通;
  • --disable-***取消ffmpeg中相应部分的编译,--enable-***则是开启,具体的选项参考./configure --help。这些命令可以用来减小产生的库的大小,从而方便移植到移动端;
  • 可以用--enable-everything关闭大多数编解码器和相关内容,然后加入特定的编解码器,如--enable-decoder=aac。实践中使用--enable-everything后我不知道应该再开启哪些muxerdemuxer,所以我只手动关闭了其他部分。另外不开启--enable-protocol=file无法读写文件。
  • 大部分其他相关博客中会对configure的内容进行修改,这里因为产生.a的静态库(--enable-static)所以不再需要修改。用FFmpeg静态库连接后面的c++代码再去生成.so动态库只产生一个文件,更方便使用。

4. 编译

  1. chmod +x build_android.sh命令为build_android.sh添加执行权限。
  2. sudo su命令进入超级用户模式,因为涉及到文件读写,省事。
  3. 执行./build_android.sh
  • 编译FFmpeg-4.1.4时候会报下图所示的错误,将libavformat/udp.c的290到295行注释掉即可。
    NDK编译FFmpeg-4.1.4 & JNI部署_第1张图片
  1. 完成后在ffmpeg-4.1.4/android目录下生成了我们需要的库和头文件。对应的CPU版本目录下的includelib即为所需。

JNI部署

改日再写。

你可能感兴趣的:(FFmpeg)