FFmpeg源码的编译和裁剪,生成安卓使用的.so库
2019-10-31 本文已影响0人
ZebraWei
版权声明:本文为卫伟学习总结文章,转载请注明出处!
本文在Linux环境下编译ffmpeg源码:
-
1.准备工作:下载ndk和ffmpeg源码,我的是android-ndk-r16b-linux-x86_64和ffmpeg-3.3.9
-
2.如图,将下载的ndk和ffmpeg源码解压,放在同一目录下
关于版本的选择问题,大家基本都用2.x.x的版本。高版本与低版本相比,一般性能和各个方面都会有一些改进,比如视频解码方法 avcodec_decode_video2 在 3.x.x 的版本后取而代之的是 avcodec_send_packet 和 avcodec_receive_frame 。因此如果你想去查一下 3.x.x 版本的 api 资料可能会发现比较少,或者开发过程中遇到某些问题也会比较棘手。因此建议大家学习时尽量使用较高的版本,开发时尽量使用大众的版本。
下载完成后把下载好的 ndk 和 FFmpeg 用 xftp 推到 linux 云主机上。把 ndk 解压到 /lib/ndk 目录下,然后配置 NDK_PATH 环境变量: 当在控制窗口中输入echo $NDK_PATH 命令后,显示出/lib/ndk/android-ndk-r16b 表示配置成功。 一、FFmpeg库编译的思想
第三方库编译的通用思想:- 1.看了看README.md
- 2.编译项目(动静态库)需要MakeFile管理,如果已经有写好的MakeFile可以尝试着用make命令去编译,如果没有需要自己写Makefile或者采用cmake构建
- 3.如果报错需要解决,一般情况下都是Makefile的一些配置文件没有生成,所有一般需要运行configure文件
- 4.生成配置文件之后,再次运行make,但是编译后的文件(elf,so,a)只能在当前类型系统上运行
- 5.如果需要跑到android或者ios那么需要交叉编译
- 6.因此我们一般都需要往configure文件里面传一些编译参数
FFmpeg 直接解压到工作目录下:
Makefile:2: config.mak: No such file or directory
Makefile:67: /common.mak: No such file or directory
Makefile:114: /libavutil/Makefile: No such file or directory
Makefile:114: /library.mak: No such file or directory
Makefile:116: /doc/Makefile: No such file or directory
Makefile:206: /tests/Makefile: No such file or directory
make: *** No rule to make target '/tests/Makefile'. Stop.
这些文件怎么来?在 configure 脚本文件里面,当然刚开始基本看不懂,后来查看红橙博客,只需要再写一个build,sh脚本来执行./configure脚本文件即可,至于需要传递哪些参数,怎么裁剪 so 动态库这里先不详细讲,大家可以用 来查看。
根据自身需求编译FFmpeg库文件脚本ffmpeg_build.sh内容:
#!/bin/bash
. /etc/profile
function build
{
echo "start build ffmpeg for $ARCH"
./configure --target-os=linux \
--prefix=$PREFIX --arch=$ARCH \
--disable-doc \
--enable-shared \
--disable-static \
--disable-yasm \
--disable-asm \
--disable-symver \
--enable-gpl \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--cross-prefix=$CROSS_COMPILE \
--enable-cross-compile \
--sysroot=$SYSROOT \
--enable-small \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
echo "build ffmpeg for $ARCH finished"
}
ARCH=arm
CPU=arm
PREFIX=$(pwd)/android/$ARCH
TOOLCHAIN=$NDK_PATH/android-toolchains/arm-19
CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi-
ADDI_CFLAGS="-marm"
SYSROOT=$TOOLCHAIN/sysroot
build
如果大家不出意外会得到以上文件,我们发现编译出来是 linux 的命名方式。只能在Linux平台下运行。如果想到android平台下运行,还需要用到NDK目录下make_standalone_toolchain.py交叉工具链,生成android平台的so库文件
ubuntu@VM-0-9-ubuntu:~/ffmpeg-3.3.9/android/arm/lib$ ls
libavcodec.so libavformat.so libswresample.so
libavcodec.so.57 libavformat.so.57 libswresample.so.2
libavcodec.so.57.89.100 libavformat.so.57.71.100
libswresample.so.2.7.100
libavdevice.so libavutil.so libswscale.so
libavdevice.so.57 libavutil.so.55 libswscale.so.4
libavdevice.so.57.6.100 libavutil.so.55.58.100 libswscale.so.4.6.100
libavfilter.so libpostproc.so pkgconfig
libavfilter.so.6 libpostproc.so.54
libavfilter.so.6.82.100 libpostproc.so.54.5.100
用的ndk build/tools路径下的make-standalone-toolchain.py 脚本文件
book@www.100ask.org:/lib/ndk/androanid-ndk-r20/build/tools$ sudo ./make_standalone_toolchain.py --arch arm --api 19 --install-dir /lib/ndk/android-ndk-r20/android-toolchains/android-19/arch-arm
我们还需要在 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)'
替换成如下
添加congfigure和ffmpg_build.sh的执行权限:
chmod u+x ffmpeg_build.sh
执行ffmpeg_build.sh脚本后生成如下图绿色的颜色的.so文件就可以在arm平台上运行啦。