reiji6695301
@reiji6695301 (田中 令治)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

AndroidアプリでH.264映像ストリームを表示するために、FFMPEGのライブラリのビルド方法を教えてください。

解決したいこと

Androidアプリに、IPカメラの映像を表示する機能を追加しようしています。
映像受信~表示を行いますが、この処理をGStreamerのpipelineとして実装しようとしています。
例えば、GStreamer pipelineは次のようなものとします。
"udpsrc port=xxxx ! application/x-rtp, payload=96 ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! autovideosink"
このpipelineを実現するために、GStremaer pluginをビルドして、プロジェクトに組み込む必要があります。
GStreamer Pluginのビルドなどは、GSTreamer Tutorialを参考に学ぶことができます。
その中で、GStreamer Pluginである、avdev_h264をビルドするには、Android向けのFFMPEGライブラリが必要になりますが、そのライブラリをコードからビルドする方法がわかりません。

開発環境は、WindowsにAndroid Studioを使用しています。
FFMPEGのビルドのためにMSYS2 MINGW64なども導入済です。

クロス開発環境で、Android用のFFMPEGライブラリを色々試みましたが、進展しないので、実際にビルドできる手順をご存じの方があれば、情報をいただけると助かります。

よろしくお願いします。

発生している問題・エラー

記事の最後の「自分で試したこと」に記載していますので、参照してください。

該当するソースコード

git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg

自分で試したこと

次の作業を行っています。

  • Windows11 Pro (64bit)にAndroid Studioをインストール
Android Studio Iguana | 2023.2.1
Build #AI-232.10227.8.2321.11479570, built on February 22, 2024
Runtime version: 17.0.9+0--11185874 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Windows 11.0
GC: G1 Young Generation, G1 Old Generation
Memory: 4062M
Cores: 24
  • Android SDK/NDK version
SDK:34.0.0
NDK:25.2.9519653
  • GStremer androidビルド済パッケージ
gstreamer-1.0-android-universal-1.24.3
  • MSYS2 Install

    • FFMPEGのビルド作業を行う環境(MSYS2 MINGW64)
  • Android NDKパスを設定

    • export NDK_PATH={Android NDKの展開パスを設定}
  • コンパイラへのパス設定

    • export PATH=$NDK_PATH/toolchains/llvm/prebuilt/windows-x86_64/bin:$PATH
  • ビルド用環境変数設定

export ABI=arm64-v8a
export CROSS_PREFIX=/c/Users/XXXX/AppData/Local/Android/Sdk/ndk/25.2.9519653/toolchains/llvm/prebuilt/windows-x86_64/bin/aarch64-linux-android
export SYSROOT=/c/Users/XXXX/AppData/Local/Android/Sdk/ndk/25.2.9519653/toolchains/llvm/prebuilt/windows-x86_64/sysroot
export CC=${CROSS_PREFIX}21-clang
export CXX=${CROSS_PREFIX}21-clang++
#export LD=${CROSS_PREFIX}ld
export LD=ld
export AR=llvm-ar
export AS=llvm-as
export NM=llvm-nm
export STRIP=llvm-strip
export PATH=$PATH:/c/Users/XXXX/AppData/Local/Android/Sdk/ndk/25.2.9519653/toolchains/llvm/prebuilt/windows-x86_64/bin
  • configureの実行:
./configure --prefix=./android/$ABI \
    --enable-shared \
    --disable-static \
    --disable-programs \
    --disable-doc \
    --target-os=android \
    --arch=aarch64 \
    --cpu=armv8-a \
    --cross-prefix=$CROSS_PREFIX \
    --sysroot=$SYSROOT \
    --cc=$CC \
    --cxx=$CXX \
    --ld=$LD \
    --ar=$AR \
    --as=$AS \
    --nm=$NM \
    --strip=$STRIP \
    --enable-shared \
    --disable-static

これを実行すると、処理が完了しません。
実行状態を表示するために、次のように実行してみました。

bash -x ./configure --prefix=./android/$ABI \
    --enable-shared \
    --disable-static \
    --disable-programs \
    --disable-doc \
    --target-os=android \
    --arch=aarch64 \
    --cpu=armv8-a \
    --cross-prefix=$CROSS_PREFIX \
    --sysroot=$SYSROOT \
    --cc=$CC \
    --cxx=$CXX \
    --ld=$LD \
    --ar=$AR \
    --as=$AS \
    --nm=$NM \
    --strip=$STRIP \
    --enable-shared \
    --disable-static

その結果として、次のようなところで、処理が進みません。

ここまでは省略
+ eval : '${windres:=$windres_default}'
++ : /c/Users/pfb00/AppData/Local/Android/Sdk/ndk/25.2.9519653/toolchains/llvm/prebuilt/windows-x86_64/bin/aarch64-linux-androidwindres
+ probe_cc as llvm-as
+ pfx=as
+ _cc=llvm-as
+ first=
+ unset _type _ident _cc_c _cc_e _cc_o _flags _cflags
+ unset _ld_o _ldflags _ld_lib _ld_path
+ unset _depflags _DEPCMD _DEPFLAGS
+ _flags_filter=echo
+ llvm-as --version
+ grep -q '^GNU assembler'
+ llvm-as -v
+ grep -q '^gcc.*LLVM'
+ llvm-as -v
+ grep -qi '^gcc'
+ llvm-as --version
+ grep -q '^icc'
+ llvm-as -v
+ grep -q xlc
+ llvm-as --vsn
+ grep -Eq 'ARM (C/C\+\+ )?Compiler'
+ llvm-as -v
+ grep -q clang
+ llvm-as -V
+ grep -q Sun
+ llvm-as -v
+ grep -q 'PathScale\|Path64'
+ llvm-as -v
+ grep -q Open64
+ llvm-as
+ grep -q 'Microsoft.*ARM.*Assembler'
0

1Answer

Comments

  1. @reiji6695301

    Questioner

    @itagagakiさん

    コメントありがとうございます。
    mobile-ffmpegは、かなり前のコードのようで、ビルドしてみましたが、うまくいきません。
    エラーを確認しながら、対応していけばできるかもしれませんが、私の知識では厳しそうです。(すみません)

    ffmpegのライブラリを必要とした目的が、GStreamerのプラグインを作ることでした。
    ffmpeg-kitはビルドはできたように見えますが、.soとか.aのようなライブラリは見当たりません。
    私の知識が少ないため、ffmpeg-kitの内容の理解が追い付いていないのが問題だと思いますが、目的を達成できていません。

    ffmpegのオリジナルコードから、もう少し取組んでみます。
    お気づきなど情報があれば、コメントいただけると、参考にさせていただきますので、よろしくお願いします。

  2. @reiji6695301

    Questioner

    @itagagakiさん
    mobile-ffmpegの更新は、ffmpeg-kitに移行されたという記事を見つけました。
    ということで、ffmpeg-kitをもう少し調べてみることにしました。

    ビルド済にバイナリも用意されているようなので(mobile-ffmpegの頃の話?)、そのあたりを確認してみます。

    参考記事:UnityでMobile-FFmpegを使う

  3. ffmpeg-kitのビルドのためにandroid.shを実行するとbuild.logファイルにログが出力されるようになっているようですが、そこに何か手がかりは見つかりませんか?

  4. @reiji6695301

    Questioner

    @itagagakiさん
    色々お騒がせしましたが、結局、MSYS2環境を作成し、git clone https://git.ffmpeg.org/ffmpeg.git ffmpegで取得して、順番に課題をクリアするとビルドできました。
    結局、私の理解不足でしたが、ひとつひとつ乗り越えることになりました。
    もともと、FFMPEGのAndroid向けのライブラリが必要だった理由は、GStreamerのH.264ストリームのための、Pluginをビルドに、FFMPEGが必要ということだったのです。
    しかし、FFMPEGがなくても、OpenH264のPluginをビルドできたので、課題はクリアできました。
    今回の件で、FFMPEGのAdroid版のビルドも勉強できましたので、良かったと思います。
    フォローいただきありがとうございました。

Your answer might help someone💌