此系列文章将记录我学习FFmpeg的过程。
在网上也有很多编译FFmpeg(Android平台)的教程,但是,有些教程也说的不是很详细,让我刚入门FFmpeg的时候走了很多弯路。所以,我决定写这篇文章,让初学者能够少走一些弯路。
PS:我是在Windows下安装虚拟机进行编译,编译为单库版,也就是只有一个libffmpeg.so一个文件。
这里用到的环境是:VMware + Ubuntu kylin 16.04 LTS + android-ndk-r14b-linux-x86_64
首先安装VMware虚拟机,并且创建一台虚拟机,然后安装Ubuntu系统,这里我不多说,请自觉百度。
安装完Ubuntu后是这个样子
接着下载 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的版本
接着下载NDK:
这就是我们刚刚下载的文件:
接着我们把这2个文件复制(拖拽)到Ubuntu,
接着双击打开,接着点击鼠标右键,再点击Extract... 进行解压
而我是解压到如下2个目录
重点来了!
此时开始用命令行了
然后cd到解压后的ffmpeg的目录。
因为编译会生成许多文件,所以我们这里给ffmpeg-3.0.10设置777权限:
chmod -R 777 ffmpeg-3.0.10
接着cd到ffmpeg-3.0.10目录
由于我们是要编译为单库版,所以不需要修改Configure文件的内容。
此时我们先修改Configure文件的权限为777权限:chmod 777 configure
然后我们执行Configure文件,生成编译所需要的文件 :./configure
此时系统提示我们要用屏蔽yasm才能执行,直接我们修改命令为:./configure --disable-yasm
执行完成后
接下来我们就编写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
编写完脚本后,我们把这个脚本复制(拖拽)到ffmpeg-3.0.10目录下
接下来我们修改build_android.sh的权限为777权限:chmod 777 build_android.sh
最后,我们执行build_android.sh脚本开始编译:./build_android.sh
此时,已经开始编译了
接下来就是漫长的等待了,当然,如果你给虚拟机的配置够高的话,编译是很快的,如果配置太低,编译时间就不好说了。
此时,已经编译成功了
接着我们返回当前目录的上一级,就可以看到多了一个ffmpeg3.0.10-onelib的文件夹,此时我们进去这个文件夹,就可以看到编译好的libffmpeg.so文件了。
至此ffmpeg编译为Android平台下的so文件就完成了。
这是我编译好的so库:http://download.csdn.net/download/jamingx666/10210315