#ffmpeg 编译android so库文件
ffmpeg是现在主流播放器和直播软件中常用的库,主要用于视频的编解码,下面主要介绍一下,ffmpeg如何在android平台上使用。ffmpeg想在android上使用,一般都是在官网下载源码,然后编译成相应的so库。
参考了好几篇网上的博客,利用其提供的shell脚本编译,总是报 文件找不到或者编译参数错误:
Unknown option "--disable-ffserver".
See ./configure --help for available options.
Makefile:2: ffbuild/config.mak: No such file or directory
Makefile:40: /tools/Makefile: No such file or directory
...
最后老老实实下载老的版本的ffmpeg(3.0和3.3都编译通过)和ndk才解决。
ffmpeg 下载:
wget http://ffmpeg.org/releases/ffmpeg-3.3.tar.gz
通过改变版本号下载不同版本
android-ndk-r13b 下载:
https://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip
Node:注意下载对应版本和系统的ndk,之前直接把windows系统的ndk拷贝到ubantu下,导致后面编译找不到文件
##编译
1、下载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)'
2、在根目录添加编译的shell文件:build_android.sh:
注意修改NDK(ubuntu版本的ndk的目录)
#!/bin/bash
export NDK=/home/lammy/ffmpeg/android-ndk-r13b
export SYSROOT=$NDK/platforms/android-19/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export CPU=arm
ARCH=arm
export PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
#注意下面的 \ 后面不要带空格
./configure \
--prefix=$PREFIX \
--arch=$ARCH \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--extra-ldflags="$ADDI_LDFLAGS" \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--target-os=linux \
--enable-cross-compile \
--enable-gpl \
--enable-shared \
--disable-static \
--disable-doc \
--enable-small \
--disable-programs \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
3、给shell脚本赋予权限并运行
chmod 777 build_android.sh
./build_android.sh
成功运行后会生成android/arm文件存在include和lib文件
include目录:
lib目录:
可以看到生成了2种so库,带版本和不带版本的(android通常用到的是带版本号的库文件),我用的是window下的ubuntu下虚拟机编译的,为了方便使用我们将android这个文件夹压缩后,拷贝出来以便使用。(不压缩无法直接从虚拟机拷贝到windows下)。
这里给出编译好的so库和include文件,欢迎各位老铁下载。
下一篇讲如何在android studio中使用我们编译好的库和include文件。
随着版本递增,ffmpeg的编译更简单
下面是
Ubuntu 18.04
android-ndk-14b
ffmpeg3.4
编译方法:
下载ffmpeg后,在根目录创建build_android.sh(3.4版本后不需要更改configure文件内容)
里面内容:
echo "进入编译ffmpeg"
export NDK=/root/ff/android-ndk-r14b
#架构下的so库和头文件
export PLATFORM=$NDK/platforms/android-21/arch-arm
#交叉编译工具 谁来用,用在哪
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export CPU=armv7-a
#输出路径
export PREFIX=./android/$CPU
function buildFF
{
echo "开始编译...."
./configure \
--prefix=$PREFIX \
--target-os=android \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--arch=arm \
--cpu=armv7-a \
--sysroot=$PLATFORM \
--extra-cflags="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=neon -mfloat-abi=softfp " \
--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
--enable-shared \
--enable-runtime-cpudetect \
--enable-gpl \
--enable-small \
--enable-cross-compile \
--enable-asm \
--enable-neon \
--enable-jni \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-hwaccel=h264_mediacodec \
--disable-debug \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-postproc \
--disable-avdevice \
--disable-symver \
--disable-stripping
make -j8
make install
echo "编译完毕"
}
buildFF
当然根据是否支持软解码,我们可以编写个函数,同时编译出支持 硬解码和不支持的库
echo "进入编译ffmpeg"
NDK=/root/ff/android-ndk-r14b
#架构下的so库和头文件
PLATFORM=$NDK/platforms/android-21/arch-arm
#交叉编译工具 谁来用,用在哪
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
CPU=armv7-a
#输出路径
PREFIX=./android/$CPU
function buildFF
{
echo "开始编译...."
./configure \
--prefix=$PREFIX \
--target-os=android \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--arch=arm \
--cpu=$CPU \
--sysroot=$PLATFORM \
--extra-cflags="$CFLAGS" \
--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
--enable-shared \
--enable-runtime-cpudetect \
--enable-gpl \
--enable-small \
--enable-cross-compile \
# --enable-asm \
# --enable-neon \
# --enable-jni \
# --enable-mediacodec \
# --enable-decoder=h264_mediacodec \
# --enable-hwaccel=h264_mediacodec \
--disable-debug \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-postproc \
--disable-avdevice \
--disable-symver \
--disable-stripping \
$ADD
make -j8
make install
echo "编译完毕"
}
buildFF
###############################
echo "编译支持neno和硬解码"
CPU=armv7-a
PREFIX=./android/armv7-a-neon-hard
CFLAGS="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=neon -mfloat-abi=softfp "
ADD="--enable-asm \
--enable-neon \
--enable-jni \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-hwaccel=h264_mediacodec "
buildFF
###############################
echo "编译不支持neno和硬解码"
CPU=armv7-a
PREFIX=./android/$CPU
CFLAGS"-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=vfp -mfloat-abi=softfp "
ADD=
buildFF
node
1、 ubuntu写成shell文件,则不需要加export,如果直接执行命令则要加export
2、在执行build_android.sh 之前,需要给权限,若执行了没给,然后再给可能会出现一些库找不到,这时候最好换个文件夹,重新解压压缩包,make clean 然后重新执行 build文件。
3、上面的两种编译有时候 会只编译第一种,第二种就不编译了,因此最好一次只使用一种
执行后如下: