Android平台下的FFmpeg的学习之路------(一)编译

时间:2020-12-30 04:35:20

此系列文章将记录我学习FFmpeg的过程。

在网上也有很多编译FFmpeg(Android平台)的教程,但是,有些教程也说的不是很详细,让我刚入门FFmpeg的时候走了很多弯路。所以,我决定写这篇文章,让初学者能够少走一些弯路。

PS:我是在Windows下安装虚拟机进行编译,编译为单库版,也就是只有一个libffmpeg.so一个文件。

这里用到的环境是:VMware + Ubuntu kylin 16.04 LTS + android-ndk-r14b-linux-x86_64

首先安装VMware虚拟机,并且创建一台虚拟机,然后安装Ubuntu系统,这里我不多说,请自觉百度。

安装完Ubuntu后是这个样子

Android平台下的FFmpeg的学习之路------(一)编译

Android平台下的FFmpeg的学习之路------(一)编译Android平台下的FFmpeg的学习之路------(一)编译接着下载 FFmpeg源代码 和 android-ndk-r14b-linux-x86_64工具。

FFmpeg : http://ffmpeg.org/

NDK : https://developer.android.google.cn/ndk/downloads/index.html

首先下载FFmpeg:

FFmpeg 当前最新是 3.4.1的版本,我们还是选择旧一点的版本 3.0.10的版本

Android平台下的FFmpeg的学习之路------(一)编译

Android平台下的FFmpeg的学习之路------(一)编译

Android平台下的FFmpeg的学习之路------(一)编译

接着下载NDK:

Android平台下的FFmpeg的学习之路------(一)编译

这就是我们刚刚下载的文件:

Android平台下的FFmpeg的学习之路------(一)编译Android平台下的FFmpeg的学习之路------(一)编译

接着我们把这2个文件复制(拖拽)到Ubuntu,

Android平台下的FFmpeg的学习之路------(一)编译

接着双击打开,接着点击鼠标右键,再点击Extract... 进行解压

Android平台下的FFmpeg的学习之路------(一)编译

而我是解压到如下2个目录

Android平台下的FFmpeg的学习之路------(一)编译Android平台下的FFmpeg的学习之路------(一)编译

重点来了!

此时开始用命令行了

Android平台下的FFmpeg的学习之路------(一)编译

然后cd到解压后的ffmpeg的目录。

因为编译会生成许多文件,所以我们这里给ffmpeg-3.0.10设置777权限:

chmod -R 777 ffmpeg-3.0.10

Android平台下的FFmpeg的学习之路------(一)编译

接着cd到ffmpeg-3.0.10目录

由于我们是要编译为单库版,所以不需要修改Configure文件的内容。

此时我们先修改Configure文件的权限为777权限:chmod 777 configure

Android平台下的FFmpeg的学习之路------(一)编译

然后我们执行Configure文件,生成编译所需要的文件 :./configure

Android平台下的FFmpeg的学习之路------(一)编译

此时系统提示我们要用屏蔽yasm才能执行,直接我们修改命令为:./configure --disable-yasm

Android平台下的FFmpeg的学习之路------(一)编译

执行完成后

Android平台下的FFmpeg的学习之路------(一)编译

接下来我们就编写build_android.sh脚本进行编译,脚本如下:

make clean
  
export NDK=/home/ubuntu64/API/android-ndk-r14b
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt
export PLATFORM=$NDK/platforms/android-9/arch-arm
export PREFIX=../ffmpeg3.0.10-onelib
build_one(){
  ./configure --target-os=android --prefix=$PREFIX \
--enable-cross-compile \
--enable-runtime-cpudetect \
--disable-asm \
--arch=arm \
--cc=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-gcc \
--cross-prefix=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi- \
--disable-stripping \
--nm=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-nm \
--sysroot=$PLATFORM \
--enable-gpl --enable-static --disable-shared --enable-nonfree --enable-version3 --enable-small \
--enable-zlib --disable-ffprobe --disable-ffplay --disable-ffmpeg --disable-ffserver --disable-debug \
--extra-cflags="-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -marm -march=armv7-a"   
}
  
build_one
  
make  
make install  
  
$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -L$PREFIX/lib -soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavfilter/libavfilter.a libswresample/libswresample.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a libpostproc/libpostproc.a libavdevice/libavdevice.a -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker $PREBUILT/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a  

Android平台下的FFmpeg的学习之路------(一)编译

编写完脚本后,我们把这个脚本复制(拖拽)到ffmpeg-3.0.10目录下

Android平台下的FFmpeg的学习之路------(一)编译

接下来我们修改build_android.sh的权限为777权限:chmod 777 build_android.sh

Android平台下的FFmpeg的学习之路------(一)编译

最后,我们执行build_android.sh脚本开始编译:./build_android.sh

Android平台下的FFmpeg的学习之路------(一)编译

此时,已经开始编译了

Android平台下的FFmpeg的学习之路------(一)编译

接下来就是漫长的等待了,当然,如果你给虚拟机的配置够高的话,编译是很快的,如果配置太低,编译时间就不好说了。

此时,已经编译成功了

Android平台下的FFmpeg的学习之路------(一)编译

接着我们返回当前目录的上一级,就可以看到多了一个ffmpeg3.0.10-onelib的文件夹,此时我们进去这个文件夹,就可以看到编译好的libffmpeg.so文件了。

Android平台下的FFmpeg的学习之路------(一)编译

Android平台下的FFmpeg的学习之路------(一)编译

至此ffmpeg编译为Android平台下的so文件就完成了。

这是我编译好的so库:http://download.csdn.net/download/jamingx666/10210315