美文网首页
Linux 下编译ffmpeg android so库

Linux 下编译ffmpeg android so库

作者: 捏了脸 | 来源:发表于2021-07-06 17:31 被阅读0次

    1、下载ffmpeg和NDK

    ffmpeg使用4.2.2为例,先下载到linux

    wget https://ffmpeg.org/releases/ffmpeg-4.2.2.tar.gz

    解压到当前目录

    tar -zxvf ffmpeg-4.2.2.tar.gz

    更多版本

    NDK使用21Linux版本

    在这个地址使用手动下载 完成后再放到linux中

    https://developer.android.google.cn/ndk/downloads/

    下载完成后解压

    unzip android-ndk-r21e-linux-x86_64.zip

    上面都解压完的效果:

    2、配置文件

    1、修改so文件的命名规则,默认so库命名:文件名+.so+三段版本号的格式比如 libavformat.so.57.0.101,这样的格式我们无法直接使用,所以需要修改成xxx.so样式,去掉后面的版本

    进入到ffpemg目录,修改configure文件

    cd ffmpeg-4.2.2

    vim configure

    打开configure文件后可以使用 /+关键字搜索定位到下面内容位置(我使用/SLIBNAME_WITH_MAJOR进行定位)

    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)'

    这样就修改了so的命名

    3、新增编译文件

    新建一个用了编译so库的文件android_build.sh

    vim android_build.sh

    把下面内容复制进去,下面包含了arm\x86平台的编译,一次只能编译一个,通过注释完成不同平台的编译

    #!/bin/bash

    NDK=/home/mirrer/work/ffmpeg/android-ndk-r21e #这个是ndk目录根据前面下载的目录修改

    HOST_TAG=linux-x86_64

    #HOST_TAG 的值根据系统修改

    #macOS  darwin-x86_64

    #Linux  linux-x86_64

    #32-bit Windows  windows

    #64-bit Windows  windows-x86_64

    TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$HOST_TAG

    API=21

    function build_android

    {

    echo "Compiling FFmpeg for $CPU and prefix is $PREFIX" #这里会打印出编译后so库的目录

    ./configure \

        --prefix=$PREFIX \ #配置so库编译后的目录

        --disable-x86asm \

        --disable-neon \

        --disable-hwaccels \

        --disable-gpl \

        --disable-postproc \

        --enable-shared \ #打开编译成动态库

        --enable-jni \  #打开jni 通过 jni 调用 java 调用 硬解码

        --disable-mediacodec \

        --disable-decoder=h264_mediacodec \ #关闭指定编码

        --disable-static \

        --disable-doc \

        --disable-ffmpeg \

        --disable-ffplay \

        --disable-ffprobe \

        --disable-avdevice \

        --disable-doc \

        --disable-symver \

        --cross-prefix=$CROSS_PREFIX \ #指定编译器

        --target-os=android \ #编译完成后在android系统中运行

        --arch=$ARCH \  #指定CPU架构

        --cpu=$CPU \ #指定CPU指令集

        --cc=$CC \  #指定编译器

        --cxx=$CXX \

        --enable-cross-compile \

        --sysroot=$SYSROOT \

        --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \

        --extra-ldflags="$ADDI_LDFLAGS" \

        $ADDITIONAL_CONFIGURE_FLAG

    # make clean

    # make -j2

    # make install

    echo "The Compilation of FFmpeg for $CPU is completed"

    }

    # arm64-v8a  aarch64-linux-android

    # ARCH=arm64

    # CPU=armv8-a

    # TRIPLE=aarch64-linux-android

    # STRIP=aarch64-linux-android

    # OPTIMIZE_CFLAGS="-march=$CPU"

    # armeabi-v7a armv7a-linux-androideabi

    ARCH=arm

    CPU=armv7-a

    TRIPLE=armv7a-linux-androideabi

    STRIP=arm-linux-androideabi

    OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "

    echo "set arm cup"

    # # x86 i686-linux-android

    # ARCH=x86

    # CPU=x86

    # TRIPLE=i686-linux-android

    # STRIP=i686-linux-android

    # OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"

    # x86-64  x86_64-linux-android

    # ARCH=x86_64

    # CPU=x86-64

    # TRIPLE=x86_64-linux-android

    # STRIP=x86_64-linux-android

    # OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 -mtune=intel"

    CC=$TOOLCHAIN/bin/$TRIPLE$API-clang

    CXX=$TOOLCHAIN/bin/$TRIPLE$API-clang++

    SYSROOT=$NDK/toolchains/llvm/prebuilt/$HOST_TAG/sysroot

    CROSS_PREFIX=$TOOLCHAIN/bin/$STRIP-

    PREFIX=$(pwd)/android/$CPU

    function build

    {

      build_android

      echo "start make"

      make clean

      make -j4

      echo "start make install"

      make install

      echo "make finish"

    }

    build

    等待编译完成后 so文件默认会在当前目录/android/armv7-a下

    到此so库编译完成

    相关文章

      网友评论

          本文标题:Linux 下编译ffmpeg android so库

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