一:下载ffmpeg源码到/root/ff目录
使用git下载的话先安装git(https://github.com/FFmpeg/FFmpeg.git):
或者使用wget直接下载相应的版本:官网地址https://ffmpeg.org/download.html#releases
https://ffmpeg.org/releases/ffmpeg-3.4.tar.bz2
因为之前已经配置共享目录,也可以直接把windows中下载好的直接拷贝过去。
这时去查看ff目录下文件:
执行 tar -xvf ffmpeg-3.4.tar.bz2将文件解压
解压NDK压缩包 zip使用unzip命令,先安装unzip(长文件可以先打出头部名按tab键快捷输入),安装好之后解压
此时查看目录
安装make打包工具,关于make:make工具是一个简化编译工作程序,有了它我们可以进行所谓的“自动化编译”,极大地提高了软件开发的效率。make工具相当于一个Shell,通过解释Makefile的中的命令进行工作。大多数IDE都有这个工具,比如:Visual C++的nmake,Linux下GNU的make。通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。
二:下面要准备编译脚本:
配置一些环境变量
#ndk目录
export NDK=/root/ff/android-ndk-r21b
#架构下的so库和头文件
export PLATFORM=KaTeX parse error: Expected 'EOF', got '#' at position 43: …ch-arm #̲交叉编译工具 谁来用,用在哪 …NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
#指定cpu的输出类型
export CPU=armv7-a
#输出的路径
export PREFIX=./android/KaTeX parse error: Undefined control sequence: \ at position 326: … ./configure \̲ ̲ 输出路径 …PREFIX
目标系统
–target-os=android
–cross-prefix=KaTeX parse error: Undefined control sequence: \ at position 38: …x-androideabi- \̲ ̲ --arch=arm …PLATFORM
–extra-cflags="-IKaTeX parse error: Undefined control sequence: \ at position 70: …t-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
#开启协处理器 提高FPS
–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
运行上面的脚本发现出错了:
这个文件不存在,查看这个路径发现还真没有
因为自从NDK的r19开始,由于gcc兼容clang的编译方式有问题,该版本已经移除了相关gcc文件,所以用老方法交叉编译的时候,会提示找不到gcc文件。
如果把NDK版本换成14后重新配置环境变量执行脚本发现是OK的
但如果还是用21的版本该怎么搞呢?去除gcc推荐使用clang,将cc路径修改
–cc=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang \
执行:
make clear
make -j8编译
make install 安装
这时指定的输出路径下android目录下:
三:创建Shell脚本文件便于长期使用:
创建一个android.sh的文件
修改权限
使用编辑工具编辑脚本内容
#!/bin/bash
echo "进入编译ffmpeg脚本"
#架构下的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 "开始编译ffmpeg脚本"
./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 "结束编译ffmpeg脚本"
}
buildFF
运行一下试试:
修改脚本实现动态配置一些参数:
#!/bin/bash
echo "进入编译ffmpeg脚本"
NDK=/root/ff/android-ndk-r14b
#5.0
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 "开始编译ffmpeg"
./configure \
--prefix=$PREFIX \
--target-os=android \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--arch=arm \
--cpu=$CPU \
--sysroot=$PLATFORM \
--extra-cflags="$CFLAG" \
--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 \
--disable-debug \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-postproc \
--disable-avdevice \
--disable-symver \
--disable-stripping \
$ADD
make -j16
make install
echo "编译结束!"
}
###########################################################
echo "编译支持neon和硬解码"
CPU=armv7-a
PREFIX=./android/armv7-a-neon-hard
CFLAG="-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 "编译不支持neon和硬解码"
CPU=armv7-a
PREFIX=./android/$CPU
CFLAG="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=vfp -mfloat-abi=softfp "
ADD=
buildFF
此时再次执行,此时会生成两套: