FFmpeg源码的编译和裁剪,生成安卓使用的.so库

版权声明:本文为卫伟学习总结文章,转载请注明出处!
本文在Linux环境下编译ffmpeg源码:

  • 1.准备工作:下载ndk和ffmpeg源码,我的是android-ndk-r16b-linux-x86_64和ffmpeg-3.3.9

  • 2.如图,将下载的ndk和ffmpeg源码解压,放在同一目录下

    FFmpeg源码的编译和裁剪,生成安卓使用的.so库_第1张图片
    关于版本的选择问题,大家基本都用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 环境变量:
    FFmpeg源码的编译和裁剪,生成安卓使用的.so库_第2张图片
    当在控制窗口中输入echo $NDK_PATH 命令后,显示出/lib/ndk/android-ndk-r16b 表示配置成功。
    FFmpeg源码的编译和裁剪,生成安卓使用的.so库_第3张图片
    一、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 编译文件了,那是不是可以直接编译运行呢?使用 make 命令出现如下错误:

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源码的编译和裁剪,生成安卓使用的.so库_第4张图片

根据自身需求编译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 脚本文件

 [email protected]:/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)'

替换成如下
FFmpeg源码的编译和裁剪,生成安卓使用的.so库_第5张图片

添加congfigure和ffmpg_build.sh的执行权限:

chmod u+x ffmpeg_build.sh 

执行ffmpeg_build.sh脚本后生成如下图绿色的颜色的.so文件就可以在arm平台上运行啦。

你可能感兴趣的:(FFmpeg源码的编译和裁剪,生成安卓使用的.so库)