Androidに動画変換ffmpeg(libavcodec)を組込む


ffmpegやffplayerで使用されているlibavcodecをAndroid用にビルドしたので備忘録です。

ライブラリ作成手順

参考サイトを記載します。こちらの通りに行うとlibavcodec.soファイルは作成できるようです。前提条件として、LinuxへのAndroid NDK環境の構築とAndroid NDKの初歩的なノウハウ知識が必要です。

参考サイト

  • odroid
    英語による解説サイトです。
  • COCOAQUA
    日本語による説明のサイトです。
  • Android Core – Android Tutorial
    英語による説明のサイトです。日本語のサイトより少し分かりやすいかもしれません。
  • A Bit? No!!!
    中国語による説明のサイトです。プロジェクト作成から説明してくれています。

リリースされているアプリ

海外で『FFmpeg for Android Beta』がリリースされています。こちらはFFmpegコマンドをそのまま入力する形式のアプリになります。

ffmpegのバージョン

FFmpeg 0.6.3でも試したのですが、ライブラリ作成後、どうもFFMPEGがうまく動いてくれなく(おそらく画像Scaleのシフト演算で失敗)FFmpeg 0.7-rc1にしました。こちらではrc1のパッチ適応とコンパイルエラーを地道に修正後、動画からの画像キャプチャまで確認できました。

ライブラリ作成後

ライブラリ作成後は、sample.javaとsample.cのようなファイルを作成し、libavcodec.aのAPIを使用したソース(JNIを利用する)を記載します。ソース作成後は、libavcodec.soをライブラリとして取り込むよう、Android.mkを作成します。その後、ndk-buildをもう一度かけます。

作業の感想

参考を元にlibavcodecライブラリを作成までは進めましたが、思っていたような動画変換処理がなかなかできず手こずりました。0.7-rc1には、コンパイルエラーもあるのでパッチ(http://patches.libav.org/patch/2476/)も適用しなければいけなかったし…。対応手順は多すぎて忘れてしまいましたので省略します。とりあえず検証として確認はできました。

作業メモ

いろいろ試し結果windows上でcygwinを使用したbuildはあきらめ、vm-wareにUbuntuを載せてコンパイルしました。試行錯誤した際のメモがあったので追記しておきます。

#!/bin/bash
#/cygdrive/c/android-ndk/toolchains/arm-eabi-4.4.0/prebuilt/windows
#/cygdrive/c/android-ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows
#PREBUILT=/cygdrive/c/android-ndk/build/prebuilt/linux-x86/arm-eabi-4.4.0
#PLATFORM=/cygdrive/c/android-ndk/build/platforms/android-8/arch-arm
#PREFIX_DIR=~/Developments/Android-ffmpeg/ffmpeg-android-bin
#PREBUILT=/cygdrive/c/android-ndk/toolchains/arm-eabi-4.4.0/prebuilt/windows
#PLATFORM=/cygdrive/c/android-ndk/platforms/android-8/arch-arm
#PREFIX_DIR=/cygdrive/c/cygwin/home/user/ffmpeg-bin


./configure --prefix=/cygdrive/c/cygwin/home/user/ffmpeg-bin --disable-yasm --target-os=linux --arch=arm --enable-version3 --enable-gpl --enable-nonfree --disable-stripping --disable-ffmpeg --disable-ffplay --disable-ffserver --disable-ffprobe --disable-encoders --disable-muxers --disable-devices --disable-protocols --enable-protocol=file --enable-avfilter --disable-network --disable-mpegaudio-hp --disable-avdevice --enable-cross-compile 

--cc=/cygdrive/c/android-ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-eabi-gcc --cross-prefix=/cygdrive/c/android-ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-eabi- --nm=/cygdrive/c/android-ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-eabi-nm --extra-cflags=”-fPIC -DANDROID” --disable-asm --enable-neon --enable-armv5te --extra-ldflags=”-Wl,-T,/cygdrive/c/android-ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/arm-eabi/lib/ldscripts/armelf.x -Wl,-rpath-link=/cygdrive/c/android-ndk/platforms/android-8/arch-arm/usr/lib -L /cygdrive/c/android-ndk/platforms/android-8/arch-arm/usr/lib -nostdlib /cygdrive/c/android-ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/lib/gcc/arm-eabi/4.4.0/crtbegin.o /cygdrive/c/android-ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/lib/gcc/arm-eabi/4.4.0/crtend.o -lc -lm -ldl”

■エラー
arm-eabi-gcc is unable to create an executable file.t/windows

■うまくいった
./configure --enable-version3 --enable-gpl --enable-nonfree --disable-stripping --disable-ffmpeg --disable-ffplay --disable-ffserver --disable-ffprobe --disable-encoders --disable-muxers --disable-devices --disable-protocols --enable-protocol=file --enable-avfilter --disable-network --disable-mpegaudio-hp --disable-avdevice

■参考URL
android with ffmpet
http://xcocoaquax.blogspot.com/2010/11/ffmpegandroid-22.html

about ffmpeg install
http://babukuma.com/2011/02/linuxffmpeg.html

ffmpeg install on cygwin
http://www.kkaneko.com/rinkou/cygwin/ffmpeg.html

development of android ndk 
http://www.usefullcode.net/2010/12/android_ndkzlib.html

■minwg-android-ndkつかってみた
cygwin 事前導入
For Windows, a recent release of Cygwin is required
GNU Make 3.81 or later
GNU Makeinfo (most recent version)
GIT (for downloading toolchain sources)
Most recent GNU Libtool packages (automake, autoconf etc)
GNU C/C++ 3.x or later (for Windows, it should be exactly 3.x, not 4.x)
ncurses library (for Cygwin, it should be ncurses-devel package)
GNU flex (most recent version)
patch utility. Most likely, it is already installed if you are using Linux or Mac OS X; however, in Cygwin it should be installed explicitl
wget
automake

cd ~
wget http://www.crystax.net/data/android-ndk-r4-crystax-4.diff
wget http://www.crystax.net/data/android-ndk-r4-windows-crystax-4.zip


cmd /c ”icacls . /grant Everyone:(F) /T”
gunzip android-ndk-r4-windows-crystax-4.zip
mv android-ndk-r4-crystax-4.diff android-ndk-r4-windows-crystax-4/android-ndk-r4-windows-crystax/.
cd android-ndk-r4-windows-crystax-4/android-ndk-r4-windows-crystax

patch -p1 < android-ndk-r4-crystax-4.diff ←できなかった


export ANDROID_NDK_ROOT=`pwd`
export CC=gcc-3

./build/tools/download-toolchain-sources.sh --release=myrelease --package --over-http --verbose --for-date=2010-07-15  ←時間かかる

./build/tools/rebuild-all-prebuilt.sh --verbose --package --toolchain-src-pkg=/tmp/android-ndk-toolchain-myrelease.tar.bz2

■実行エラー
 コンパイルオプションにenable-encodeとmuxerが必要

■コンパイルエラー
 parse_number_or_die エラーでパッチを適用。
http://patches.libav.org/patch/2476/

RUSAGE_SELF 1 -> 0
HAVE_SETRLIMIT 1 -> 0
version.hを作成 > #define FFMPEG_VERSION ”UNKNOWN”

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です