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 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'