Android开发——编译FFmpeg(二、Linux系统编译FFmpeg)

在上一章中我们简要介绍了编译FFmpeg的一些基础知识,如果你对这些FFmpeg for Android还不是很了解,建议移步Android开发——编译FFmpeg(一、前言)简单学习一下。本章我将详细介绍如何在Linux系统上编译FFmpeg for Android。

前期准备:

  • Linux环境(Ubuntu 16.04):64位

  • NDK :可以从NDK官网上下载,Linux上可以直接用命令行下载 我这里使用的是android-ndk-r10e,网上有人说ndk16及以上的使用会有问题(我用android-ndk-r16b也出现了问题)

  • FFmpeg :FFmpeg官网 我这里使用的是ffmpeg-4.2.2.tar.gz

在Linux的usr目录下新建ndk文件夹
进入ndk文件夹,下载ndk包:
wget https://dl.google.com/android/repository/android-ndk-r10e-linux-x86_64.zip
解压Android-ndk包:
unzip android-ndk-r10e-linux-x86_64.zip
下载FFmpeg包:
wget https://www.ffmpeg.org/releases/ffmpeg-4.2.2.tar.gz
解压FFmpeg包:
tar -xzvf ffmpeg-4.2.2.tar.gz

配置NDK环境变量

gedit ~/.bashrc 

在末尾加上:

export NDKROOT=/usr/ndk/android-ndk-r1e
export PATH=$NDKROOT:$PATH

保存退出后,更新环境变量:
source ~/.bashrc

1. 修改FFmpeg中Configure文件

进入文件夹 ffmpeg-4.2.2中,输入“gedit configure” 点击Enter键,打开后,ctrl + F 输入build setting,会跳转到我们需要修改的地方。如果用vim打开文件,可以在命令行模式中,输入“: ? build setting” 就会搜到要改的地方。具体修改内容见下图:

Android开发——编译FFmpeg(二、Linux系统编译FFmpeg)_第1张图片

 将上图中的注释部分修改为以下内容,这一步的主要目的是生成Android能够使用的 名称-版本.so文件的格式,否则生成的是Linux上使用库,Android不能用。

SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'

2. 编写Android编译脚本

在ffmpeg-4.2.2文件夹中,新建build_android.sh文件(命令:touch build_android.sh)

打开build_android.sh文件,粘贴如下内容:

#!/bin/bash
#清空
make clean
#你的NDK路径
export NDK=/usr/ndk/android-ndk-r10e
#Android平台编译器的版本
export SYSROOT=$NDK/platforms/android-9/arch-arm/
#编译过程使用的toolchain
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export CPU=arm
#文件输出路径
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-Os -fpic -marm"
function build_one
{
./configure \
    --prefix=$PREFIX \
    --target-os=linux \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --arch=arm \
    --sysroot=$PLATFORM \
    --extra-cflags="-I$PLATFORM/usr/include" \
    --cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
    --nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
    --disable-shared \
    --enable-runtime-cpudetect \
    --enable-gpl \
    --enable-small \
    --enable-cross-compile \
    --disable-debug \
    --enable-static \
    --disable-doc \
    --disable-asm \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-postproc \
    --disable-avdevice \
    --disable-symver \
    --disable-stripping \
make clean
make -j4
make install
}
build_one

3. 编译FFmpeg

给ndk里的所有文件设置权限 

chmod 777 -R /usr/ndk

执行   ./android_build.sh

这里可能会报错:recipe for target 'libavformat/udp.o' failed

Android开发——编译FFmpeg(二、Linux系统编译FFmpeg)_第2张图片

解决办法是注释掉报错的ffmpeg-4.2.2/libavformat/udp.c代码段 290——295行

Android开发——编译FFmpeg(二、Linux系统编译FFmpeg)_第3张图片

编译成功后的文件会在/usr/ndk/ffmpeg-4.2.2/android路径目录下。实际上这个脚本执行完,会编译出现多个.so文件,我们使用的取/usr/ndk/ffmpeg-4.2.2/android/arm/lib中的大版本号的,就是名字里面有数字的。

Android开发——编译FFmpeg(二、Linux系统编译FFmpeg)_第4张图片

 OK!在Linux系统上编译FFmpeg for Android完成了,下一章我会介绍如何在Windows系统上编译。再往后,我会介绍如何使用编译后的FFmpeg。

附录:

  1. 编译完成的ffmpeg-4.2.2.
  2. 编译完成的ffmpeg-2.2.3.

你可能感兴趣的:(Android,开发)