ffmpeg系列之编译安卓版ffmpeg库

Posted 狂奔的CD

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ffmpeg系列之编译安卓版ffmpeg库相关的知识,希望对你有一定的参考价值。

前言

FFmpeg是一个autoconf项目,cmake那套编译方法就没办法用了,因为autoconf只支持Unix-like的系统。所以最好在linux下编译、。网上有各种教程,但是跟着弄的时候又跑不通,关键问题在于ndk的版本,和build_android.sh脚本要对应,以下内容是采用ndk21版本编译出来的,不适用其他版本

正文

准备资源

准备ffmpeg源码
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg

准备安卓ndk21
wget https://dl.google.com/android/repository/android-ndk-r21b-linux-x86_64.zip
unzip android-ndk-r21b-linux-x86_64.zip

配置解压后的文件夹ffmpeg中的configure

cd ffmpeg
vim configure

3921行左右.将如下内容

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)'

这一步的主要目的是生成Android能够使用的 名称-版本.so文件的格式,不然的话生成的是Linux上使用库,Android不能用。

编写Android编译的脚本

ps:注意以下脚本只能配合ndk21使用

cd ffmpeg
vim build_android.sh

#!/bin/bash
# 清空上次的编译
make clean
#你自己的NDK路径.
PREFIX=build_android
NDK=/home/anjoiner/Android/Sdk/ndk-bundle
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
SYSROOT=$TOOLCHAIN/sysroot
API=21

function build_android

echo "Compiling FFmpeg for $CPU"
./configure \\
    --prefix=$PREFIX \\
    --disable-static \\
    --disable-doc \\
    --disable-ffmpeg \\
    --disable-ffplay \\
    --disable-ffprobe \\
    --disable-doc \\
    --disable-symver \\
    --enable-nonfree \\
    --enable-gpl \\
    --enable-small \\
    --enable-neon \\
    --enable-hwaccels \\
    --enable-avdevice \\
    --enable-postproc \\
    --enable-shared \\
    --enable-jni \\
    --enable-mediacodec \\
    --enable-decoder=h264_mediacodec \\
    --cross-prefix=$CROSS_PREFIX \\
    --target-os=android \\
    --arch=$ARCH \\
    --cpu=$CPU \\
    --nm=$NM \\
    --strip=$STRIP \\
    --cc=$CC \\
    --cxx=$CXX \\
    --enable-cross-compile \\
    --sysroot=$SYSROOT \\
    --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \\
    --extra-ldflags="$ADDI_LDFLAGS" \\
    $ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
echo "The Compilation of FFmpeg for $CPU is completed"


#armv8-a
ARCH=aarch64-linux-android-
VERSION=arm64
CPU=armv8-a
CROSS_PREFIX=$TOOLCHAIN/bin/$ARCH
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
NM=$TOOLCHAIN/bin/$ARCHnm
STRIP=$TOOLCHAIN/bin/$ARCHstrip
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"
build_android

#armv7-a
ARCH=arm-linux-androideabi-
VERSION=arm
CPU=armv7-a
CROSS_PREFIX=$TOOLCHAIN/bin/$ARCH
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
NM=$TOOLCHAIN/bin/$ARCHnm
STRIP=$TOOLCHAIN/bin/$ARCHstrip
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -march=$CPU"
build_android

编译

一定要sudo执行,否则无法再/usr/local/share目录下创建文件
./configure --disable-x86asm
sudo chmod +x build_android.sh
sudo ./build_android.sh

以上是关于ffmpeg系列之编译安卓版ffmpeg库的主要内容,如果未能解决你的问题,请参考以下文章

ffmpeg系列之移植到安卓中调用

ffmpeg系列之移植到安卓中调用

Mac中编译FFmpeg教程(Android版)

[ffmpeg 扩展第三方库编译系列] 关于libopenjpeg mingw32编译问题

FFmpeg之Linux下编译与调试

[ffmpeg 扩展第三方库编译系列] 关于 mingw32 下编译libcaca