链接:https://pan.baidu.com/s/1zB9r5WwuTMIPNMlYl5HlvA
提取码:5ndl
没有Ubuntu的朋友,可以看我下篇博客进行搭建
为什么需要编译ffmpeg?
ffmpeg是用C语言写的,我们想要使用在JNI中引用ffmpeg提供的函数,那么首先就需要将ffmpeg的源代码编译成静态库或者是动态库,这样在JNI中,我们就可以以静态库或动态库的方式去加载ffmpeg中的函数。
为什么需要NDK?
ffmpeg虽然是C语言写的,但不是用什么编译器编译都行,比如你想在windows上使用ffmpeg,那么就要求你用针对于Windos的C编译器。你想在Linux上使用ffmpeg,就要求你用针对于Linux的C编译器,同理,你在Android上使用ffmpeg,就要求你使用针对于Android上的C编译器。而NDK,这里面恰好提供了针对Android的C编译器,所以我们需要在Linux上安装NDK。
ubuntu上安装NDK
这里我的系统是ubuntu,如果你是初学者,那么建议你的环境,以及使用的工具都有我一样,避免出了问题,你无法解决。
这里我使用如下的NDK版本,推荐大家使用。
android-nkd-r17-linux-x86_64.zip后,在linux上,按如下命令解压
unzip android-ndk-r17-linux-x86_64.zip
解压之后,如下
然后将NDK的根目录设置到NDK_ROOT变量里,注意NDK_ROOT是我自己定义的一个变量,到时要配合一个shell脚本使用,所以大家名字别搞错了。
开始设置NDK_ROOT变量
切换到android-ndk-r17里,输入pwd,可以获取当前目录的全路径,如下
设置环境变量NDK_ROOT
用export 设置NDK_ROOT
用echo 输出一下,如果有显示,就说明确实配置成功了.
下载ffmpeg源码
官网http://ffmpeg.org/download.html
我用的是下面这个版本,你们可以跟我一样
下载好后,在ubuntu中,用如下方式解压
解压好之后,进入ffmpeg-4.2.2
在ffmpeg-4.2.2里面有个configure
这个configure是做什么的呢?
它是一个可执行文件,它的作用是生成makefile文件。
makefile文件是做什么的呢?
maefile是告诉c编译器,应该先编译哪些代码,后编译哪些代码。至于哪些先编译,哪些后编译,对我们而言不需要关心,我们只要运行这个configure,让它帮助我们自动生成makefile就行了。
configure 在执行时,需要配置很多参数,我们自己输入太麻烦了。于是,我做了一个shell脚本,在shell脚本里配置了configure需要用到的参数,到时我们运行这个shell脚本就好了。shell脚本内容如下,文件名是myconfigure.sh
在网盘里提供了该文件
#!/bin/bash
CPU=arm-linux-androideabi
TOOLCHAIN=$NDK_ROOT/toolchains/$CPU-4.9/prebuilt/linux-x86_64
#从as的 externalNativeBuild/xxx/build.ninja
FLAGS="-isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -O0 -fPIC"
INCLUDES=" -isystem $NDK_ROOT/sources/android/support/include"
PREFIX=./ndkInstall
./configure \
--prefix=$PREFIX \
#优化编译大小
--enable-small \
#不生成可执行程序
--disable-programs \
#不支持Android 摄像头的开发,因此禁用掉
--disable-avdevice \
#音视频编码功能,可以先屏蔽掉
--disable-encoders \
#禁用所有的混合器
--disable-muxers \
#禁用所有的过滤器
--disable-filters \
#开启交叉编译
--enable-cross-compile \
#指定交叉编译器的路径
--cross-prefix=$TOOLCHAIN/bin/$CPU- \
#禁用动态库生成
--disable-shared \
#作为开发,推荐生成静态库,目的是避免apk太大。
--enable-static \
#指定要导入的标准头文件,以及实现函数的路径
--sysroot=$NDK_ROOT/platforms/android-21/arch-arm \
--extra-cflags="$FLAGS $INCLUDES" \
--extra-cflags="-isysroot $NDK_ROOT/sysroot/" \
#针对于arm CPU架构
--arch=arm \
#用于Android系统
--target-os=android
# 清理一下
make clean
#执行makefile
make install
里面是写什么内容,如果看不懂,那就算了,直接先用我这个脚本,先把ffmpeg玩熟练了,再回过头来看。
这个脚本的运行需要我上面配置的NDK_ROOT环境变量,如果没有配置的朋友,一定要先配置了,才能运行我这个脚本。
将myconfigure.sh拷贝到configure所在的目录
可以发现它现在是白色的,说明它缺少执行权限,执行chmod +x myconfigure.sh 可以给该文件添加执行权限。
变为绿色,就说明有执行权限了,那么就通过下面代码来执行它
./myconfigure.sh
首次执行,就不顺利,遇到下面的错误,大概是说缺少一个nasm或者yasm的汇编编译器。
既然它说没有,我们就使用下面的命令安装一个yasm吧
sudo apt-get install yasm
安装好了之后,接下来就继续执行./myconfigure,这一次执行很顺利,就是等待时间有点长。
在编译完成以后,在myconfigure的同级目录中有一个ndkInstall目录,编译好的静态库和对应的头文件,都在这里面
由于我命名没注意,应该是ffmpeg的库目录,被我写成了ndkInstall目录,请大家忽略这点吧
我们在Android中开发音视频,目的就是使用ffmpeg提供的函数,因此,我们只需要将include 和 lib 中的内容拷贝到AndroidStudio中就可以进行开发工作了。