美文网首页
CentOS编译FFmpeg for Android动态库

CentOS编译FFmpeg for Android动态库

作者: 编程的猫 | 来源:发表于2020-06-13 12:35 被阅读0次

    我的环境:CentOS7,AndroidNDK-r20b,FFmpeg-4.1,XShell6,Xftp6
    以上资源可以从官网下载,然后传到CentOS下,也可以直接在CentOS下下载。XShell和Xftp自行安装,关联CentOS

    1.FFmpeg下载

    FFmpeg官网地址,可以单独下载后再通过Xftp上传到CentOS的一个目录,解压。
    或者CentOS上直接下载,如下:

    #下载
    wget http://www.ffmpeg.org/releases/ffmpeg-4.1.tar.gz
    #解压
    tar -zxvf ffmpeg-4.1.tar.gz
    #进入解压后的目录
    cd ffmpeg-4.1
    #准备
    ./configure
    make
    make install
    
    2.配置Android NDK
    第一种方法

    2.1 先将Android NDK压缩包下载下来
    2.2 将压缩包通过Xftp上传到CentOS的一个目录下(我这里是在/usr下新建了一个ffmpeg的目录)
    2.3 解压NKD

    yum -y install unzip  你的NDK.zip
    

    2.4 配置NDK的环境变量

    #进入目录
    cd /etc/profile
    
    #编辑
    vim profile
    #在profile最后添加以下代码
    export ANDROID_NDK=/usr/local/ndk/android-ndk-r20b
    export PATH=$ANDROIDNDK:$PATH
    

    2.5 刷新配置
    在终端输入以下命令:

    source profile
    

    2.6 验证NDK是否配置好
    在终端输入以下命令

    ndk-build -v
    
    第二种方法

    1.下载NDK
    2.将NDK压缩包上传到CentOS的一个目录
    3.解压NDK压缩包
    4.配置环境

    终端运行:gedit  ~/.bashrc
    
    将下面的语句加入
    
    #NDK setting  
    NDK_ROOT=/usr/ffmpeg/android-ndk-r20b  
    export NDK_ROOT 
    
    保存,终端运行:source ~/.bashrc
    
    使之立即生效。
    
    在终端运行:echo $NDK_ROOT
    
    若正确打印了NDK的路径,说明环境变量修改成功。
    
    测试是否安装成功:
    
    cd 进入android-ndk-r8b/samples/hello-jni,然后在终端运行ndk的编译脚本:
    
    ndk-build -v
    如果出现以下版本信息,说明安装成功:
    [root@localhost ffmpeg-4.1]# ndk-build -v
    GNU Make 3.81
    Copyright (C) 2006  Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.
    There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
    PARTICULAR PURPOSE.
    
    This program built for x86_64-pc-linux-gnu
    
    解压后的FFmpeg:
    image.png
    1.准备

    其中我们需要将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)'
    

    configure的文件链接
    提取码:topp
    编写build_android.sh脚本,执行这个脚本会编译出我们需要的FFmpeg的动态库
    shell脚本示例内容如下:

    #!/bin/bash
    NDK=/home/junt/Documents/android-ndk-r20
    TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/
    #这里修改的是最低支持的android sdk版本(r20版本ndk中armv8a、x86_64最低支持21,armv7a、x86最低支持16)
    API=29
    
    function build_android
    {
    #相当于Android中Log.i
    echo "Compiling FFmpeg for $CPU"
    #调用同级目录下的configure文件
    ./configure \
    #指定输出目录
        --prefix=$PREFIX \
    #各种配置项,想详细了解的可以打开configure文件找到Help options:查看
        --disable-neon \
        --disable-hwaccels \
        --disable-gpl \
        --disable-postproc \
    #配置跨平台编译,同时需要disable-static
        --enable-shared \
        --enable-jni \
        --disable-mediacodec \
        --disable-decoder=h264_mediacodec \
    #配置跨平台编译,同时需enable-shared   
        --disable-static \
        --disable-doc \
        --disable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --disable-avdevice \
        --disable-doc \
        --disable-symver \
    #关键点1.指定交叉编译工具目录
        --cross-prefix=$CROSS_PREFIX \
    #关键点2.指定目标平台为android
        --target-os=android \
    #关键点3.指定cpu类型
        --arch=$ARCH \
    #关键点4.指定cpu架构
        --cpu=$CPU \
    #超级关键点5.指定c语言编译器
        --cc=$CC
        --cxx=$CXX
    #关键点6.开启交叉编译
        --enable-cross-compile \
    #超级关键7.配置编译环境c语言的头文件环境
        --sysroot=$SYSROOT \
        --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
        --extra-ldflags="$ADDI_LDFLAGS" \
        $ADDITIONAL_CONFIGURE_FLAG
    make clean
    make
    make install
    echo "The Compilation of FFmpeg for $CPU is completed"
    }
    
    #armv8-a
    ARCH=arm64
    CPU=armv8-a
    #r20版本的ndk中所有的编译器都在/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/目录下(clang)
    CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
    CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
    #头文件环境用的不是/android-ndk-r20/sysroot,而是编译器//android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/sysroot
    SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
    #交叉编译工具目录,对应关系如下(不明白的可以看下图)
    # armv8a -> arm64 -> aarch64-linux-android-
    # armv7a -> arm -> arm-linux-androideabi-
    # x86 -> x86 -> i686-linux-android-
    # x86_64 -> x86_64 -> x86_64-linux-android-
    CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
    #输出目录
    PREFIX=$(pwd)/android/$CPU
    OPTIMIZE_CFLAGS="-march=$CPU"
    #方法调用
    build_android
    

    脚本下载
    提取码:zi2t
    将build_android.sh脚本上传到FFmpeg-4.1的文件夹下,上传完毕后再终端窗口最好执行下这个命令 dos2unix build_android.sh
    如果没有dos2unix,请安装:

    [root@localhost user]# yum install dos2unix
    
    2.修改权限

    在终端依次执行命令:

    chmod 775 configure
    
    ./configure
    

    执行完毕后会生成configure的头文件

    3.编译脚本

    在终端依次执行以下命令:

    chmod +x build_android.sh
    
    ./build_android.sh 
    

    这时候就会编译,等待编译完成,时间大概20分钟左右。编译完成后,在ffmpeg-4.1的目录下会生成android文件夹,这下面就是相应平台的so库:


    image.png
    image.png
    image.png

    至此,编译结束。然后你就可以编写你的JNI代码来调用这些库的功能了。

    相关文章

      网友评论

          本文标题:CentOS编译FFmpeg for Android动态库

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