android ffmpeg编译so,Android FFmpeg学习(一),将FFmpeg编译成so文件

前言

搜索了一堆编译so文件的方法,一直遇到问题,最后终于搞好了。

再次非常感谢《使用Android Studio开发FFmpeg的正确姿势》一文对我的帮助,让我成功编译出了so。

编译环境

FFmpeg版本: ffmpeg-4.2.2

NDK版本: r21

开始编译

Step.1 从FFmpeg官网下载最新版的ffmpeg,解压。

Step.2 在ffmpeg根目录下新建一个shell脚本,编辑里面的内容,内容如下。复制的朋友注意修改NDK_PATH字段,是你的NDK路径。

#!/usr/bin/env bash

//NDK路径

NDK_PATH=/Android/Sdk/ndk/21.0.6113669

//此处需要注意,MAC环境下使用darwin-x86_64,Windows环境下使用windows-x86_64。具体可以去NDK路径下看一下。

HOST_PLATFORM_WIN=darwin-x86_64

HOST_PLATFORM=$HOST_PLATFORM_WIN

API=21

TOOLCHAINS="$NDK_PATH/toolchains/llvm/prebuilt/$HOST_PLATFORM"

SYSROOT="$NDK_PATH/toolchains/llvm/prebuilt/$HOST_PLATFORM/sysroot"

CFLAG="-D__ANDROID_API__=$API -Os -fPIC -DANDROID "

LDFLAG="-lc -lm -ldl -llog "

PREFIX=android-build

CONFIG_LOG_PATH=${PREFIX}/log

COMMON_OPTIONS=

CONFIGURATION=

build() {

APP_ABI=$1

echo "======== > Start build $APP_ABI"

case ${APP_ABI} in

armeabi-v7a)

ARCH="arm"

CPU="armv7-a"

MARCH="armv7-a"

TARGET=armv7a-linux-androideabi

CC="$TOOLCHAINS/bin/$TARGET$API-clang"

CXX="$TOOLCHAINS/bin/$TARGET$API-clang++"

LD="$TOOLCHAINS/bin/$TARGET$API-clang"

CROSS_PREFIX="$TOOLCHAINS/bin/arm-linux-androideabi-"

EXTRA_CFLAGS="$CFLAG -mfloat-abi=softfp -mfpu=vfp -marm -march=$MARCH "

EXTRA_LDFLAGS="$LDFLAG"

EXTRA_OPTIONS="--enable-neon --cpu=$CPU "

;;

arm64-v8a)

ARCH="aarch64"

TARGET=$ARCH-linux-android

CC="$TOOLCHAINS/bin/$TARGET$API-clang"

CXX="$TOOLCHAINS/bin/$TARGET$API-clang++"

LD="$TOOLCHAINS/bin/$TARGET$API-clang"

CROSS_PREFIX="$TOOLCHAINS/bin/$TARGET-"

EXTRA_CFLAGS="$CFLAG"

EXTRA_LDFLAGS="$LDFLAG"

EXTRA_OPTIONS=""

;;

x86)

ARCH="x86"

CPU="i686"

MARCH="i686"

TARGET=i686-linux-android

CC="$TOOLCHAINS/bin/$TARGET$API-clang"

CXX="$TOOLCHAINS/bin/$TARGET$API-clang++"

LD="$TOOLCHAINS/bin/$TARGET$API-clang"

CROSS_PREFIX="$TOOLCHAINS/bin/$TARGET-"

EXTRA_CFLAGS="$CFLAG -march=$MARCH -mtune=intel -mssse3 -mfpmath=sse -m32"

EXTRA_LDFLAGS="$LDFLAG"

EXTRA_OPTIONS="--cpu=$CPU "

;;

x86_64)

ARCH="x86_64"

CPU="x86-64"

MARCH="x86_64"

TARGET=$ARCH-linux-android

CC="$TOOLCHAINS/bin/$TARGET$API-clang"

CXX="$TOOLCHAINS/bin/$TARGET$API-clang++"

LD="$TOOLCHAINS/bin/$TARGET$API-clang"

CROSS_PREFIX="$TOOLCHAINS/bin/$TARGET-"

EXTRA_CFLAGS="$CFLAG -march=$CPU -mtune=intel -msse4.2 -mpopcnt -m64"

EXTRA_LDFLAGS="$LDFLAG"

EXTRA_OPTIONS="--cpu=$CPU "

;;

esac

echo "-------- > Start clean workspace"

make clean

echo "-------- > Start build configuration"

CONFIGURATION="$COMMON_OPTIONS"

CONFIGURATION="$CONFIGURATION --logfile=$CONFIG_LOG_PATH/config_$APP_ABI.log"

CONFIGURATION="$CONFIGURATION --prefix=$PREFIX"

CONFIGURATION="$CONFIGURATION --libdir=$PREFIX/libs/$APP_ABI"

CONFIGURATION="$CONFIGURATION --incdir=$PREFIX/includes/$APP_ABI"

CONFIGURATION="$CONFIGURATION --pkgconfigdir=$PREFIX/pkgconfig/$APP_ABI"

CONFIGURATION="$CONFIGURATION --cross-prefix=$CROSS_PREFIX"

CONFIGURATION="$CONFIGURATION --arch=$ARCH"

CONFIGURATION="$CONFIGURATION --sysroot=$SYSROOT"

CONFIGURATION="$CONFIGURATION --cc=$CC"

CONFIGURATION="$CONFIGURATION --cxx=$CXX"

CONFIGURATION="$CONFIGURATION --ld=$LD"

CONFIGURATION="$CONFIGURATION $EXTRA_OPTIONS"

echo "-------- > Start config makefile with $CONFIGURATION --extra-cflags=${EXTRA_CFLAGS} --extra-ldflags=${EXTRA_LDFLAGS}"

./configure ${CONFIGURATION} \

--extra-cflags="$EXTRA_CFLAGS" \

--extra-ldflags="$EXTRA_LDFLAGS"

echo "-------- > Start make $APP_ABI with -j8"

make -j10

echo "-------- > Start install $APP_ABI"

make install

echo "++++++++ > make and install $APP_ABI complete."

}

build_all() {

COMMON_OPTIONS="$COMMON_OPTIONS --target-os=android"

COMMON_OPTIONS="$COMMON_OPTIONS --disable-static"

COMMON_OPTIONS="$COMMON_OPTIONS --enable-shared"

COMMON_OPTIONS="$COMMON_OPTIONS --enable-protocols"

COMMON_OPTIONS="$COMMON_OPTIONS --enable-cross-compile"

COMMON_OPTIONS="$COMMON_OPTIONS --enable-optimizations"

COMMON_OPTIONS="$COMMON_OPTIONS --disable-debug"

COMMON_OPTIONS="$COMMON_OPTIONS --enable-small"

COMMON_OPTIONS="$COMMON_OPTIONS --disable-doc"

COMMON_OPTIONS="$COMMON_OPTIONS --disable-programs"

COMMON_OPTIONS="$COMMON_OPTIONS --disable-ffmpeg"

COMMON_OPTIONS="$COMMON_OPTIONS --disable-ffplay"

COMMON_OPTIONS="$COMMON_OPTIONS --disable-ffprobe"

COMMON_OPTIONS="$COMMON_OPTIONS --disable-symver"

COMMON_OPTIONS="$COMMON_OPTIONS --disable-network"

COMMON_OPTIONS="$COMMON_OPTIONS --disable-x86asm"

COMMON_OPTIONS="$COMMON_OPTIONS --disable-asm"

COMMON_OPTIONS="$COMMON_OPTIONS --enable-pthreads"

COMMON_OPTIONS="$COMMON_OPTIONS --enable-mediacodec"

COMMON_OPTIONS="$COMMON_OPTIONS --enable-jni"

COMMON_OPTIONS="$COMMON_OPTIONS --enable-zlib"

COMMON_OPTIONS="$COMMON_OPTIONS --enable-pic"

COMMON_OPTIONS="$COMMON_OPTIONS --enable-avresample"

COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=h264"

COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=mpeg4"

COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=mjpeg"

COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=png"

COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=vorbis"

COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=opus"

COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=flac"

echo "COMMON_OPTIONS=$COMMON_OPTIONS"

echo "PREFIX=$PREFIX"

echo "CONFIG_LOG_PATH=$CONFIG_LOG_PATH"

mkdir -p ${CONFIG_LOG_PATH}

# build $app_abi

build "armeabi-v7a"

build "arm64-v8a"

build "x86"

build "x86_64"

}

echo "-------- Start --------"

build_all

echo "-------- End --------"

此脚本实现了 armeabi-v7a,arm64-v8a,x86,x86_64 4个平台的编译。

Step.3 通过./xxx.sh命令直接执行shell脚本,进行编译。

Step.4 编译完成之后,在ffmpeg文件下,会生成一个android-build文件夹,lib目录下就是生成好的so文件。

so的简单介绍

编译出来之后,我们会发现存在以下8个so文件。

libavformat:格式封装

libavcodec:编码、解码

libavutil:通用音视频工具,像素、IO、时间等工具

libavfilter:过滤器,可以用作音视频特效处理

libavdevice:设备(摄像头、拾音器)

libswscale:视频图像缩放,像素格式互换

libavresample:重采样

libswresample:重采样,类似图像缩放

对于入门来说,最重要的是前面三个,也就是format、codec、util,其他的可以慢慢熟悉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值