

Android
5.0以上を対象に動画編集アプリを開発しようとしていまして、そのために以下の環境にてAndroidへのFFMPEG組み込みを行おうとしております。

  * Android Studio 2.3.3
  * FFmpeg 3.3.2

[ffmpegをAndroid用にビルドする方法](http://nextat.co.jp/staff/archives/97)

上記サイトを参考にFFmpegのコンパイルやAndroid.mkを作成してのAndroidプロジェクトへの組み込みを行っていますが、うまくいっておりません。

色々なサイトを調べているのですが、環境のEclipseとAndroid Studioの違い、またAndroid
Studioのバージョンによるビルドに関する仕様の違いなどがあるらしく、基になる環境が異なる情報が入り混じってしまい、正しい形というのが分かっていない状況です。

最初に記載した

  * Android 5.0
  * Android Studio 2.3.3
  * FFmpeg 3.3.2

上記条件でFFmpegの組み込みを行う場合、どういった作業が必要なのか、またどういった手順なのか、ご存知の方がいましたらご教授いただけますでしょうか。

**発生しているエラー**

[code]

    ffmpeg.c:11: error: undefined reference to 'avcodec_version'  
    clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)  
    
[/code]

**Cのソースコード**

[code]

    #include <string.h>
    #include <jni.h>
    #include <libavcodec/avcodec.h>
    
    jstring Java_<パッケージ名>_TopActivity_stringFromJNI( JNIEnv* env, jobject thiz ) {
        //avcodec_register_all();
        int test = avcodec_version();
    
        return (*env)->NewStringUTF(env, "Hello JNI !");
    }
    
[/code]


CC BY-SA 4.0
2017-07-14T02:00:07.910
36342
2020-03-25T04:30:16.230
2020-03-25T04:30:16.230
3060
24392
question
android ffmpeg
FFmpeg の Android での利用方法について


<http://writingminds.github.io/ffmpeg-android/>  
上記のサイトを参考にしつつ、ひとまずライブラリを利用できる状態までにはすることができました。

./android-ndk-r14b  
./WritingMinds-ffmpeg-android-8809612  
このようなに各フォルダを配置し、以下のように各ファイルの内容を編集しました。

■./WritingMinds-ffmpeg-android-8809612/android_build.sh

[code]

    #!/bin/bash
    
    . settings.sh
    
    BASEDIR=$(pwd)
    TOOLCHAIN_PREFIX=${BASEDIR}/toolchain-android
    # Applying required patches
    patch  -p0 -N --dry-run --silent -f fontconfig/src/fcxml.c < android_donot_use_lconv.patch 1>/dev/null
    if [ $? -eq 0 ]; then
      patch -p0 -f fontconfig/src/fcxml.c < android_donot_use_lconv.patch
    fi
    
    for i in "${SUPPORTED_ARCHITECTURES[@]}"
    do
      rm -rf ${TOOLCHAIN_PREFIX}
      # $1 = architecture
      # $2 = base directory
      # $3 = pass 1 if you want to export default compiler environment variables
      ./libpng_build.sh $i $BASEDIR 1 || exit 1
      ./expat_build.sh $i $BASEDIR 1 || exit 1
      ./ffmpeg_build.sh $i $BASEDIR 0 || exit 1
    done
    
    rm -rf ${TOOLCHAIN_PREFIX}
    
[/code]

■./WritingMinds-ffmpeg-android-8809612/abi_settings.sh

[code]

    #!/bin/bash
    
    . settings.sh
    
    BASEDIR=$2
    
    case $1 in
      armeabi-v7a)
        NDK_ABI='arm'
        NDK_TOOLCHAIN_ABI='arm-linux-androideabi'
        NDK_CROSS_PREFIX="${NDK_TOOLCHAIN_ABI}"
      ;;
      x86)
        NDK_ABI='x86'
        NDK_TOOLCHAIN_ABI='x86'
        NDK_CROSS_PREFIX="i686-linux-android"
        CFLAGS="$CFLAGS -march=i686"
      ;;
    esac
    
    TOOLCHAIN_PREFIX=${BASEDIR}/toolchain-android
    if [ ! -d "$TOOLCHAIN_PREFIX" ]; then
      ${ANDROID_NDK_ROOT_PATH}/build/tools/make-standalone-toolchain.sh --toolchain=${NDK_TOOLCHAIN_ABI}-${NDK_TOOLCHAIN_ABI_VERSION} --platform=android-${ANDROID_API_VERSION} --install-dir=${TOOLCHAIN_PREFIX}
    fi
    CROSS_PREFIX=${TOOLCHAIN_PREFIX}/bin/${NDK_CROSS_PREFIX}-
    NDK_SYSROOT=${TOOLCHAIN_PREFIX}/sysroot
    
    export PKG_CONFIG_LIBDIR="${TOOLCHAIN_PREFIX}/lib/pkgconfig"
    
    if [ $3 == 1 ]; then
      export CC="${CROSS_PREFIX}gcc --sysroot=${NDK_SYSROOT}"
      export LD="${CROSS_PREFIX}ld"
      export RANLIB="${CROSS_PREFIX}ranlib"
      export STRIP="${CROSS_PREFIX}strip"
      export READELF="${CROSS_PREFIX}readelf"
      export OBJDUMP="${CROSS_PREFIX}objdump"
      export ADDR2LINE="${CROSS_PREFIX}addr2line"
      export AR="${CROSS_PREFIX}ar"
      export AS="${CROSS_PREFIX}as"
      export CXX="${CROSS_PREFIX}g++"
      export OBJCOPY="${CROSS_PREFIX}objcopy"
      export ELFEDIT="${CROSS_PREFIX}elfedit"
      export CPP="${CROSS_PREFIX}cpp"
      export DWP="${CROSS_PREFIX}dwp"
      export GCONV="${CROSS_PREFIX}gconv"
      export GDP="${CROSS_PREFIX}gdb"
      export GPROF="${CROSS_PREFIX}gprof"
      export NM="${CROSS_PREFIX}nm"
      export SIZE="${CROSS_PREFIX}size"
      export STRINGS="${CROSS_PREFIX}strings"
    fi
    
[/code]

■./WritingMinds-ffmpeg-android-8809612/settings.sh

[code]

    #!/bin/bash
    
    SUPPORTED_ARCHITECTURES=(armeabi-v7a x86)
    ANDROID_NDK_ROOT_PATH=${ANDROID_NDK}
    if [[ -z "$ANDROID_NDK_ROOT_PATH" ]]; then
      echo "You need to set ANDROID_NDK environment variable, please check instructions"
      exit
    fi
    ANDROID_API_VERSION=21
    NDK_TOOLCHAIN_ABI_VERSION=4.9
    
    NUMBER_OF_CORES=$(nproc)
    HOST_UNAME=$(uname -m)
    TARGET_OS=linux
    
    CFLAGS='-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all'
    LDFLAGS='-Wl,-z,relro -Wl,-z,now -pie'
    
    FFMPEG_PKG_CONFIG="$(pwd)/ffmpeg-pkg-config"
    
[/code]

その後、環境変数として以下を登録  
ANDROID_NDK=/<～ルートからのパス～>/android-ndk-r14b

/WritingMinds-ffmpeg-android-8809612に移動してandroid_build.shを実行  
./android_build.sh

以下のフォルダ配下に.soのライブラリファイルが作成される  
./WritingMinds-ffmpeg-android-8809612/build

この.soファイルを使ってFFmpegの機能をAndroid側で利用できることは最低限確認することができました。  
ここからどういった形で機能を実装していくかという問題が新たに出てはいますが、ライブラリを作成するという点ではひとまず上手くいきました。  
今後の実装方法についてはまた別途質問の方を投げさせていただこうと思います。


CC BY-SA 3.0
2017-07-25T12:52:07.993
36664
2017-07-25T12:52:07.993
24392
36342
answer