Android cmake编译FFmpeg

本文介绍了如何在Android项目中使用CMake编译FFmpeg动态库,包括设置编译环境、交叉编译FFmpeg、创建NDK项目、配置build.gradle和CMakeLists.txt,以及测试FFmpeg功能。提供了编译不同CPU指令集的FFmpeg脚本,并展示了项目结构和运行结果。
摘要由CSDN通过智能技术生成

Android cmake编译FFmpeg

项目地址
通过阅读本文,你将学到以下内容:

  1. 如何编译多种CPU指令集的FFmpeg动态库
  2. 如何配置CMakeLists.txt和build.gradle构建Android项目

编译环境

  1. ndk-r16
  2. ffmpeg-4.0.2

一、交叉编译FFmpeg生成动态库

FFmpeg是一个强大的音视频处理库,我们有时候只需要用到这个库的部分功能,因此我们需要通过configure的一些选项对它进行裁剪。此外,我们还需要配置生成哪种CPU指令集的动态库、生成的动态库在什么操作系统上使用以及一些编译选项等。
一个支持armeabi-v7a、arm64-v8a、x86和x86_64四种CPU指令集的FFmpeg编译脚本,内容如下:

#!/bin/sh

#  build.sh
#  Builds all supported architectures of FFmpeg for Android.
#  Versions: NDK - r16b, FFmpeg - 4.0.2

NDK=/Users/chenzhichang/Downloads/android-ndk-r16b
# MacOS:darwin-86_64
HOST=darwin-x86_64

# Takes three arguments:
# First: ARCH, supported values: armeabi-v7a, arm64-v8a, x86, x86_64
# Second: platform level. Range: 14-19, 21-24, 26-28
# Third: additinal configuration flags. Already present flags: --enable-cross-compile --disable-static --disable-programs --disable-doc --enable-shared --enable-protocol=file --enable-pic --enable-small
build () {
   
    ARCH=$1
    LEVEL=$2
    if [ ! $ARCH ]; then
       ARCH=armeabi-v7a
    fi 
    if [ ! $LEVEL ]; then
       LEVEL=21
    fi
    ISYSROOT=$NDK/sysroot
    PLATFORM_ARCH=
    CFLAGS=
    TARGET=
    TOOLCHAIN_FOLDER=
    
    CONFIGURATION="--disable-asm \
    --enable-cross-compile \
    --disable-static \
    --disable-programs \
    --disable-doc \
    --enable-shared \
    --enable-protocol=file \
    --enable-pic \
    --enable-small \
    --disable-devices \
    $3"
    

    case $ARCH in
        "armeabi-v7a")
            TARGET="arm-linux-androideabi"
            CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon"
            PLATFORM_ARCH="arm"
            TOOLCHAIN_FOLDER="arm-linux-androideabi"
        ;;
        "arm64-v8a")
            TARGET="aarch64-linux-android"
            CFLAGS="-march=armv8-a"
            PLATFORM_ARCH="arm64"
            CONFIGURATION="$CONFIGURATION --disable-pthreads"
            TOOLCHAIN_FOLDER="aarch64-linux-android"
        ;;
        "x86")
            TARGET="i686-linux-android"
            CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
            PLATFORM_ARCH="x86"
            TOOLCHAIN_FOLDER="x86"
        ;;
        "x86_64")
            TARGET="x86_64-linux-android"
            CFLAGS="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel"
            PLATFORM_ARCH="x86_64"
            TOOLCHAIN_FOLDER="x86_64"
        ;;
    esac

    CROSS_PREFIX=$NDK/toolchains/$TOOLCHAIN_FOLDER-4.9/prebuilt/$HOST/bin/$TARGET-
    ASM=$ISYSROOT/usr/include/$TARGET
    SYSROOT=$NDK/platforms/android-$LEVEL/arch-$PLATFORM_ARCH/
    PREFIX="android/$ARCH"

    ./configure --prefix=$PREFIX  \
                $CONFIGURATION \
                --cross-prefix=$CROSS_PREFIX \
                --arch=$PLATFORM_ARCH \
                --target-os=android \
                --sysroot=$SYSROOT \
                --extra-cflags="$CFLAGS -I$ASM -isysroot $ISYSROOT -D__ANDROID_API__=$LEVEL -Wfatal-errors -U_FILE_OFFSET_BITS -Os -fPIC -DANDROID -D__thumb__ -Wno-deprecated" 

    make clean
    make -j4
    make install
}
#build "armeabi-v7a" "21"
#build "arm64-v8a" "21"
#build "x86_64" "21"
#build "x86" "21"

这个脚本的用法很简单,只需要将该脚本文件拷贝到ffmpeg源码的根目录下,将脚本中的NDK变量值改为你的电脑上NDK所在的路径。如果你的电脑不是Mac,则还需要修改HOST变量值。最后执行下面这条命令即可。其中armeabi-v7a表示CPU指令集,21表示Android版本。

./build.sh armeabi-v7a 21

在这里简单介绍一下关于此脚本的一些配置项,从而方便你能够根据你的需求来修改这个脚本:

  1. –prefix:指定编译输出的文件路径
  2. –target-os:指定目标操作系统
  3. –disable-static:禁止生成静态库
  4. –disable-programs:禁止生成ffplay、ffmpeg等可执行文件
  5. –disable-doc:禁止生成文档
  6. –enable-shared:生成动态动态链接库
  7. –enable-cross-compile:开启交叉编译(跨平台编译)

执行此脚本,最终生成文件如下:
在这里插入图片描述

二、创建NDK项目并引入FFmpeg动态库

创建一个NDK项目,然后将生成的ffmpeg动态库文件和头文件拷贝到libs文件夹,最终项目结构如下图。
在这里插入图片描述

三、配置build.gradle

需要配置的内容如下:

  1. 配置so库的路径
  2. 配置cmake编译选项和支持的CPU指令集,其中-Wno-deprecated-declarations选项用于忽略使用废弃API的编译警告。
  3. 配置CMakeLists.txt文件的路径

最终配置如下:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.chenzhichang.testffmpeg"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        //配置so库的路径
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
        }
        //配置cmake编译选项和支持的CPU指令集
        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions -Wno-deprecated-declarations"
            }
            ndk{
                abiFilters "armeabi-v7a", "x86_64", "x86"
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    //配置CMakeLists.txt文件的路径
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
         

四、配置CMakeLists.txt

配置如下:

cmake_minimum_required(VERSION 3.4.1)

find_library( log-lib
              log )

# 定义变量
set(distribution_DIR .
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android 上使用 FFmpeg 可以提供丰富的音视频处理能力,如视频解码、编码、剪辑、滤镜等等。下面是在 Ubuntu 环境下交叉编译 FFmpeg,生成 Android 平台可用的库文件。 1. 下载 Android NDK 首先,需要下载 Android NDK,从官网 https://developer.android.com/ndk/downloads 下载最新版本的 NDK,并解压到某个目录下。 2. 安装编译工具链 在 Ubuntu 环境下,使用以下命令安装交叉编译工具链: ``` sudo apt-get update sudo apt-get install build-essential sudo apt-get install libtool sudo apt-get install automake sudo apt-get install autoconf sudo apt-get install cmake sudo apt-get install pkg-config sudo apt-get install texinfo sudo apt-get install nasm sudo apt-get install yasm ``` 3. 下载 FFmpeg 源代码 从官网 https://ffmpeg.org/download.html 下载最新版本的 FFmpeg 源代码,并解压到某个目录下。 4. 编写交叉编译脚本 在 FFmpeg 源代码目录下,新建一个 build_android.sh 文件,内容如下: ```bash #!/bin/bash NDK=/path/to/android-ndk SYSROOT=$NDK/platforms/android-21/arch-arm/ TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 function build_one { ./configure \ --prefix=$PREFIX \ --enable-shared \ --disable-static \ --disable-doc \ --disable-ffplay \ --disable-ffprobe \ --disable-ffmpeg \ --disable-debug \ --disable-avdevice \ --disable-postproc \ --disable-symver \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --target-os=linux \ --arch=arm \ --sysroot=$SYSROOT \ --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知用改创

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值