android - ffmpeg(一)

编译ffmpeg

使用Mac:

  1. 下载ffmpeg:我这边下的是4.0

    <https://github.com/FFmpeg/FFmpeg/tree/release/4.0>
    
    1. 下载ndk:用的之前下好的r16 (r17也ok,但是不能比r17更高了,更高版本没有gcc而是clang)

      将ndk加入环境变量(vim ~/.bash_profile)

      1. 在ffmpeg目录下新建一个shell脚本:build.sh
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      #!bin/bash
      NDK_ROOT=/Users/kb_jay/Documents/ndk-home/android-ndk-r16b

      CPU=arm-linux-androideabi

      TOOLCHAIN=$NDK_ROOT/toolchains/$CPU-4.9/prebuilt/darwin-x86_64

      FLAGS="-isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -O0 -fPIC"

      INCLUDES=" -isystem $NDK_ROOT/sources/android/support/include"

      PREFIX=./android/armeabi-v7a

      ./configure \ # 执行configure
      --prefix=$PREFIX \ # 指定结果目录
      --enable-small \ # 压缩体积
      --disable-programs \ # 不编译ffmpeg程序,我们只需要静态库(.a)
      --disable-avdevice \ # 关闭avdevice(这个在android中没用)
      --disable-encoders \ # 关闭编码器 (如果要使用到音视频编码,需要打开)
      --disable-muxers \ # 关闭封装器(不需要mp4,所以关掉)
      --disable-filters \ # 关闭滤镜
      --enable-cross-compile \ # 开启交叉编译
      --cross-prefix=$TOOLCHAIN/bin/$CPU- \ # gcc的前缀
      --disable-shared \ # 非动态so
      --enable-static \ # 静态a
      --sysroot=$NDK_ROOT/platforms/android-21/arch-arm \ # 指定编译的逻辑目录
      --extra-cflags="$FLAGS $INCLUDES" \ # gcc的参数
      --extra-cflags="-isysroot $NDK_ROOT/sysroot/" \ #gcc的参数
      --arch=arm \ # arm架构
      --target-os=android # Android系统

      # 清理
      make clean
      #执行makefile
      make install
      1. 执行build.sh

      2. 在ffmpeg/android/armeabi-v7a下会有我们需要的头文件以及6个静态库

集成到开发项目中

  1. 新建as项目(c++)

  2. 将cmakelists.txt文件剪切到app目录下,跟app的build.gradle同级

  3. build.gradle如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    apply plugin: 'com.android.application'

    android {
    compileSdkVersion 28
    defaultConfig {
    applicationId "com.kbjay.ffmepegdemo"
    minSdkVersion 21
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    externalNativeBuild {
    cmake {
    cppFlags ""
    abiFilters "armeabi-v7a"
    }
    }
    }
    buildTypes {
    release {
    minifyEnabled false
    proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
    }
    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'
    }
  4. 将6个静态库copy到libs/armeabi-v7a/下

  5. 将头文件copy到cpp/include下

  6. 修改CmakeLists.txt

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    cmake_minimum_required(VERSION 3.6.0)

    file(GLOB SOURCE ${CMAKE_SOURCE_DIR}/src/main/cpp/*.cpp)
    add_library(
    native-lib
    SHARED
    ${SOURCE})

    # 设置头文件
    include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/include)

    # 通过修改CMAKE_CXX_FLAGS设置静态库的路径
    set(lib_path ${CMAKE_SOURCE_DIR}/libs/${CMAKE_ANDROID_ARCH_ABI})
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${lib_path}")

    # 设置依赖
    target_link_libraries(
    native-lib
    avcodec
    avfilter
    avformat
    avutil
    swresample
    swscale
    log)
  7. 测试,修改native-lib.cpp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #include <jni.h>
    #include <string>
    #include "android/log.h"

    extern "C" {
    #include "libavcodec/avcodec.h"
    }

    extern "C" JNIEXPORT jstring JNICALL
    Java_com_kbjay_ffmepegdemo_MainActivity_stringFromJNI(
    JNIEnv *env,
    jobject /* this */) {
    const char *str = av_version_info();
    __android_log_print(ANDROID_LOG_ERROR, "ffmepeg", "%s", str);
    return env->NewStringUTF(str);
    }
  8. 运行app,显示->4.0.5.

  9. 以上。