美文网首页FFmpeg
FFmpeg源码的编译和裁剪,生成安卓使用的.so库

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

作者: ZebraWei | 来源:发表于2019-10-31 18:55 被阅读0次

    版权声明:本文为卫伟学习总结文章,转载请注明出处!
    本文在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 编译文件了,那是不是可以直接编译运行呢?使用 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库文件脚本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平台上运行啦。

    相关文章

      网友评论

        本文标题:FFmpeg源码的编译和裁剪,生成安卓使用的.so库

        本文链接:https://www.haomeiwen.com/subject/ztwtbctx.html