美文网首页
Android FFMPEG Mac编译教程

Android FFMPEG Mac编译教程

作者: 五号先生丶 | 来源:发表于2020-11-06 17:24 被阅读0次

    Android FFMPEG Mac编译教程

    需要准备的材料
    JDK 1.8
    Android SDK
    
    公司项目新需求需要开发音视频的编辑、合成、剪辑等。
    然而对于视频的各类操作,用作为面向对象语言的Java 或者 kotlin来实现显然不是一个好的选择。
    Android所提供的Media、Videa、Audio库只能对音视频做相对简单的操作,并不能满足复杂场景的业务需求。
    所以,FFMPEG是不二选择。
    

    先来看看FFMPEG是个啥

    先看一段FFMPEG官方对FFMPEG的介绍:
    FFmpeg is the leading multimedia framework, able to decode, encode, transcode, mux, demux, stream, filter and play pretty much anything that humans and machines have created. It supports the most obscure ancient formats up to the cutting edge. No matter if they were designed by some standards committee, the community or a corporation. It is also highly portable: FFmpeg compiles, runs, and passes our testing infrastructure FATE across Linux, Mac OS X, Microsoft Windows, the BSDs, Solaris, etc. under a wide variety of build environments, machine architectures, and configurations.

    大概意思:
    1、FFMPEG可以做到对视频文件解码、编码、转码;
    2、可以对多路音视频复用、解复用;
    3、对于音视频流处理;
    4、音视频的过滤器、播放;
    5、支持从远古时期到现在的几乎所有格式;
    6、Linux、Mac OS、Windows全平台支持;
    7、高可移植性。

    OK,废话不多少,关于FFMPEG的介绍就这些,想要详细了解的同学自己去官网学习。

    FFMPEG各版本下载地址

    1、把从官网下载下来的ffmpeg-3.3.6.tar.bz文件解压。

    建议不要下载最新的版本,FFMPEG需要和NDK版本对应,新版本会引入很多新的问题

    FFMPEG文件.jpg

    2、修改configure文件

    Sublime打开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)'
    

    替换为

    SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
    LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
    SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
    SLIB_INSTALL_LINKS='$(SLIBNAME)'
    

    注意别换错位置,我就是这段代码替换了错误的位置坑了好久

    3、在ffmpeg根目录下新建androidBuilder.sh脚本

    写入:

    #!/bin/bash
    # 修改为自己NDK包根目录
    export NDK_HOME=/Users/parker/Library/Android/sdk/ndk/android-ndk-r15c
    #根据自己的需求修改编译平台版本
    export PLATFORM_VERSION=android-21
    #定义编译方法
    function build
    {
        #echo 输出命令
        echo "start build ffmpeg for $ARCH"
        #调用configure命令开始编译,并传入对应的参数
        ./configure --target-os=linux \
        --prefix=$PREFIX --arch=$ARCH \
        --disable-doc \
        --disable-static \
        --disable-yasm \
        --disable-asm \
        --disable-symver \
        --disable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --disable-ffserver \
        --cross-prefix=$CROSS_COMPILE \
        --enable-cross-compile \
        --enable-shared \
        --enable-gpl \
        --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"
    }
    
    #编译 arm-v7a
    PLATFORM_VERSION=android-21
    ARCH=arm
    CPU=armeabi-v7a #CPU架构
    PREFIX=$(pwd)/android_all/$CPU  #输出路径:当前目录/android_all/CPU架构/
    TOOLCHAIN=$NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
    CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi- #交叉编译环境路径
    ADDI_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -mfpu=neon"
    ADDI_LDFLAGS="-march=armv7-a -Wl,--fix-cortex-a8"
    SYSROOT=$NDK_HOME/platforms/$PLATFORM_VERSION/arch-$ARCH/
    build
    

    保存。

    4、打开终端,把androidBuilder.sh拖进去,Enter。

    编译的过程当中会申请很多的权限,一路允许就好。
    部分权限需要手动去 偏好设置->安全与隐私 手动授权。
    编译过程大概五到十分钟。
    编译完成之后,在ffmpeg目录下会出现新的文件夹android_all.如图:

    编译完成之后的android_all文件夹.png

    armeabi-v7a目录下的include和lib就是我们引入Android需要使用的头文件和动态链接库。

    到此FFMPEG编译结束。

    备注

    如果在整个过程中出现错误,排查顺序:
    如果FFMPEG源码编译失败:

    1、检查自己的NDK版本号和FFMPEG源码是否对应;
    2、检查androidBuilder.sh中是否正确替换了自己的sdk地址。
    3、检查FFMPEG根目录下的configure文件中的代码更换位置是否正确。

    后续会写FFPEG for Android使用教程。

    祝各位同僚一切顺利!

    相关文章

      网友评论

          本文标题:Android FFMPEG Mac编译教程

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