アンドロイド用FFmpeg1.0

Roman10氏のブログ(How to Build FFmpeg for Android | roman10)からFFmpeg0.8.12のアンドロイド用バイナリはできていたが、FFmpeg0.8.12はビデオ時間(Duration)が間違った値になっていたので、正常(と思われる)Durationを返すFFmpeg1.0をビルドしてみた。
以下が、FFmpeg1.0のビルドスクリプトです。
(FFmpeg 1.0, NDK r8b, CPU armeabi)

#!/bin/bash
NDK=/home/myname/android-ndk-r8b
PLATFORM=$NDK/platforms/android-8/arch-arm/
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
function build
{
./configure \
    --sysroot=$PLATFORM \
    --cc=$PREBUILT/bin/arm-linux-androideabi-gcc \
    --cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
    --enable-cross-compile \
    --target-os=linux \
    --arch=arm \
    --extra-ldflags='-Wl' \
    --disable-shared \
    --enable-static \
    --enable-gpl \
    --enable-version3 \
    --enable-nonfree \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-avdevice \
    --enable-avfilter \
    --enable-swresample \
    --disable-postproc \
    --enable-small \
    --disable-symver \
    --disable-debug \
    --disable-stripping \
    $ADDITIONAL_CONFIGURE_FLAG
sed -i 's/HAVE_LRINT 0/HAVE_LRINT 1/g' config.h
sed -i 's/HAVE_LRINTF 0/HAVE_LRINTF 1/g' config.h
sed -i 's/HAVE_ROUND 0/HAVE_ROUND 1/g' config.h
sed -i 's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g' config.h
sed -i 's/HAVE_TRUNC 0/HAVE_TRUNC 1/g' config.h
sed -i 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h
make clean
make  -j4 install
$PREBUILT/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o
$PREBUILT/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib  -soname libffmpeg.so -shared -nostdlib  -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a libavfilter/libavfilter.a libswresample/libswresample.a -lc -lm -lz -ldl -llog  --warn-once  --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a
}

#armeabi v5TE
CPU=armeabi
#OPTIMIZE_CFLAGS="-marm -march=$CPU"
PREFIX=./android/$CPU 
#ADDITIONAL_CONFIGURE_FLAG=
build

以上で、ffmpeg.soができるので、コマンド実行用のライブラリのビルドをします。

Android.mk

LOCAL_PATH := $(call my-dir)

#declare the prebuilt library
include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg-prebuilt
LOCAL_SRC_FILES := ffmpeg-1.0/android/armeabi/libffmpeg.so
LOCAL_EXPORT_C_INCLUDES := ffmpeg-1.0/android/armeabi/include
LOCAL_EXPORT_LDLIBS := ffmpeg-1.0/android/armeabi/libffmpeg.so
LOCAL_PRELINK_MODULE := true
include $(PREBUILT_SHARED_LIBRARY)

#the andzop library
include $(CLEAR_VARS)
LOCAL_ALLOW_UNDEFINED_SYMBOLS=false
LOCAL_MODULE := ffmpeg_main_jni
LOCAL_SRC_FILES := my_ffmpeg.c my_cmdutils.c ffmpeg_opt.c ffmpeg_filter.c mylog.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/ffmpeg-1.0
LOCAL_SHARED_LIBRARY := ffmpeg-prebuilt
LOCAL_LDLIBS := -llog -ljnigraphics -lz -lm $(LOCAL_PATH)/ffmpeg-1.0/android/armeabi/libffmpeg.so
include $(BUILD_SHARED_LIBRARY)

my_ffmpeg.c, my_cmdutil.cはffmpeg.c,cmdutil.cを少し変更したもの、ffmpeg_opt.c, ffmpeg_filter.cはそのまま、mylog.cは自分用のlog関数です。
Application.mk

APP_ABI := armeabi
APP_PLATFORM := android-8

ffmpeg.cのexit_program()をexit()しないように修正する。exit_program()のnoreturnを外した。(外しておかないとexit_program()の後でセグメンテーション違反が発生して落ちたので…)

簡単に要点だけを書いたが、これだけするにも数ヶ月かかった。FFmpegは面倒だなぁ…。
FFmpegの都合で、最後のほうはubuntu12.04を使っていたが、Androidアプリを作るにはwindowsよりもubuntuのほうが快適動作する(AVDが特に早い)ことがわかり、今後Androidアプリを作るんならubuntuでしようと思った。