在Linux环境下使用NDK编译FFmpeg

文章目录

        • 在Linux环境下使用NDK编译FFmpeg
            • 1)编译前的准备工作
            • 2)开始使用NDK编译FFmpeg


在Linux环境下使用NDK编译FFmpeg

  • 本教程讲解如何在Linux系统中使用NDK编辑FFmpeg动态链接库
  • NDK:Native Development Kit,是 Android 的一个工具开发包
    • NDK 提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库
    • NDK 能自动将 so(动态链接库)和 java 应用一起打包成 apk(应用程序包)
  • JNI:Java Native Interface,它提供若干的 API 实现 Java 与其他语言之间的通信
    • JNI:可以在 Android 中使用 JNI 来调用 FFmpeg 的 so(动态链接库)
  • 该动态链接库可以运行在 ARM(armv8-a、armv7-a、x86、x86-64)架构中。
1)编译前的准备工作
  • Ubuntu 18.04 X64(系统)
    • apt-get install yasm
    • apt-get install pkg-config
  • Android NDK(下载)
    • android-ndk-r20b-linux-x86_64.zip
    • https://developer.android.google.cn/ndk/downloads/
  • FFmpeg(下载)
    • http://ffmpeg.org/download.html#releases
    • 在 FFmpeg 中使用 h264_mediacodec 建议版本 3.4.7
2)开始使用NDK编译FFmpeg
  • 解码 android-ndk-r20b-linux-x86_64.zip 到 /home/nljb/
  • 解压 ffmpeg-4.2.4.tar.gz 到 /home/nljb/
  • 修改 /home/nljb/ffmpeg-4.2.4/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)'
  • 创建 /home/nljb/ffmpeg-4.2.4/build.sh 文件
  • 执行 sh -x build.sh 即可开始编译 ……
  • 如出现 asm 异常则增加(–disable-asm)即可
  • 编译完成后可以在 $(pwd)/android/$CPU 查看结果
#!/bin/bash
make clean

export NDK=/home/nljb/android-ndk-r20b
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/
API=21

function build_android
{
     
    echo "Compiling FFmpeg for $CPU"
    ./configure \
    --prefix=$PREFIX \
    --enable-neon \
    --enable-hwaccels \
    --enable-gpl \
    --enable-shared \
    --enable-jni \
    --enable-mediacodec \
    --disable-decoders \
        --enable-decoder=h264_mediacodec \
        --enable-decoder=vp9 \
        --enable-decoder=h264 \
        --enable-decoder=mpeg4 \
        --enable-decoder=aac \
        --enable-decoder=aac_latm \
        --enable-decoder=mjpeg \
        --enable-decoder=png \
        --enable-decoder=mpeg4_mediacodec \
    --disable-encoders \  // 按需开启
        --enable-encoder=vp9_vaapi --enable-encoder=h264_nvenc --enable-encoder=h264_v4l2m2m --enable-encoder=hevc_nvenc \
    --disable-demuxers \ // 按需开启
        --enable-demuxer=rtsp --enable-demuxer=rtp --enable-demuxer=flv --enable-demuxer=h264 \
    --disable-muxers \ // 按需开启
        --enable-muxer=rtsp --enable-muxer=rtp --enable-muxer=flv --enable-muxer=h264 \
    --disable-parsers \ // 按需开启
        --enable-parser=mpeg4video --enable-parser=aac --enable-parser=h264 --enable-parser=vp9 \
    --disable-protocols \ // 按需开启
        --enable-protocol=rtmp --enable-protocol=rtp --enable-protocol=tcp --enable-protocol=udp \
    --disable-bsfs \
    --disable-indevs --enable-indev=v4l2 \
    --disable-outdevs \
    --disable-filters \
    --disable-postproc \
    --disable-static \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --enable-avdevice \
    --disable-doc \
    --disable-symver \
    --cross-prefix=$CROSS_PREFIX \
    --target-os=android \
    --arch=$ARCH \
    --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 -j6
    make install
    echo "The Compilation of FFmpeg for $CPU is completed"

}

#armv8-a
ARCH=arm64
CPU=armv8-a
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"
build_android

#armv7-a
ARCH=arm
CPU=armv7-a
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
build_android

#x86
ARCH=x86
CPU=x86
CC=$TOOLCHAIN/bin/i686-linux-android$API-clang
CXX=$TOOLCHAIN/bin/i686-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
build_android

#x86_64
ARCH=x86_64
CPU=x86-64
CC=$TOOLCHAIN/bin/x86_64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/x86_64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 -mtune=intel"
build_android
#!/bin/bash

export NDK=/root/android-ndk-r20b
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/
API=21

#armv7-a
ARCH=arm
CPU=armv7-a
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU -DBIONIC_IOCTL_NO_SIGNEDNESS_OVERLOAD"

    echo "Compiling FFmpeg for $CPU"
    ./configure \
    --prefix=$PREFIX \
    --disable-asm \
    --enable-neon \
    --enable-hwaccels \
    --enable-shared \
    --enable-jni \
    --enable-mediacodec \
    --enable-decoders \
    --disable-encoders \
    --enable-demuxers \
    --enable-muxers \
    --enable-parsers \
    --enable-protocols \
    --disable-bsfs \
    --disable-indevs \
    --disable-outdevs \
    --disable-filters \
    --disable-postproc \
    --disable-static \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --enable-avdevice \
    --disable-doc \
    --disable-symver \
    --cross-prefix=$CROSS_PREFIX \
    --target-os=android \
    --arch=$ARCH \
    --cpu=$CPU \
    --cc=$CC \
    --cxx=$CXX \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG

你可能感兴趣的:(FFmpeg)