AndroidアプリにFFmpegを組み込んで、動画にウォーターマークを追加する

ffmpeg Advent Calendar 2014 7日目です。
初投稿ですが、よろしくお願いします。

NDKビルド環境は
Windows7 Professional 64bit
VMware Player 6.0.3
Ubuntu 12.04 64bit
Eclipse Kepler Service Release 2
Android NDK Revision 10c
です

#事前準備
FFmpegでウォーターマークを追加する動画(mp4)と画像ファイル(png)

#NDKビルド環境構築
###VMwarePlayerとUbuntu 12.04(64bit)インストール
[VMware PlayerをWindows7にインストールする](http://www2.rikkyo.ac.jp/~tokiwa/menu/bioLib/os/windows/vmware_ubuntu.html)

###OpenJDK 6,7インストール
[How to download and install prebuilt OpenJDK packages：OpenJDK公式](http://openjdk.java.net/install/)

```bash
sudo apt-get -yV install openjdk-7-jre
sudo apt-get -yV install openjdk-6-jre
```

###OpenJDKを使うように設定

```bash
sudo update-java-alternatives --jre -s `sudo update-java-alternatives -l | grep 1.7.0 | awk '{print $1}'`
sudo update-java-alternatives --jre-headless -s `sudo update-java-alternatives -l | grep 1.7.0 | awk '{print $1}'`
sudo update-java-alternatives -s `sudo update-java-alternatives -l | grep 1.7.0 | awk '{print $1}'` 
```

###設定の確認とJAVA_HOME設定
[Ubuntu で Android NDK を使ってみる](http://www.kkaneko.jp/rinkou/js/andk.html)

* 次のコマンドを実行し、/usr/lib/jvm/java-7-openjdk-amd64...の行に設定されていることを確認

```bash
sudo update-alternatives --config java 
```

* javaのバージョン確認

```bash
update-java-alternatives -l 
java -version 
```

* 環境変数 JAVA_HOME の設定（~/.bashrc の設定例）

```bash
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export PATH=/usr/lib/jvm/java-7-openjdk-amd64/jre/bin:$PATH
export CLASSPATH=.:/usr/lib/jvm/java-7-openjdk-amd64/lib
```

###Android SDKインストール
[Ubuntu 12.04 で Android SDK のダウンロードとインストールとテスト実行](http://www.kkaneko.jp/rinkou/js/adsk.html)

* [Android公式サイト](http://developer.android.com/sdk/index.html)からSDK Tools OnlyのLinux 32 & 64-bitをダウンロード

ダウンロードしたファイルを解凍（ここでは/usr/localを指定) 

```bash
cd /usr/local
sudo tar -xvzof /tmp/android-sdk_r23.0.2-linux.tgz
```

* ファイルの所有者の変更

```bash
sudo chown -R ＜ユーザ名＞ /usr/local/android-sdk-linux
```

* AVD Manager の起動

Android SDK Platform-tools と Android 2.3.3 をインストールする

```bash
cd /usr/local
cd android-sdk-linux
sudo ./tools/android
```

* 環境変数の設定（~/.bashrc の設定例）

```bash
export PATH=$PATH:/usr/local/android-sdk-linux/tools:/usr/local/android-sdk-linux/platform-tools
```

###Eclipseと各種プラグイン、Pleiades(日本語化プラグイン)のインストール

```bash
sudo apt-get -yV install eclipse
sudo apt-get -yV install eclipse-cdt
sudo apt-get -yV install eclipse-jdt
sudo apt-get -yV install eclipse-sdk
sudo apt-get -yV install eclipse-platform
sudo apt-get -yV install eclipse-platform-data
sudo apt-get -yV install eclipse-plugin-cvs
sudo apt-get -yV install eclipse-rcp
sudo apt-get -yV install pleiades 
```

* Pleiadesの設定を/usr/local/eclipse/eclipse.iniに追加する

```bash
-javaagent:/usr/local/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
```

* Eclipseを試しに起動する

```bash
eclipse
```

###ADTインストール

[Ubuntu で Eclipst と Eclipse の ADT プラグインのダウンロードとインストール](http://www.kkaneko.jp/rinkou/js/eclipseadt.html)の
「Eclipse ADT (Eclipse のプラグイン Android Development Tools) のダウンロードとインストール」
を参考に実施

###CDT(C/C++プログラミング環境)インストール

[Eclipse に C/C++ 開発ツール (CDT) をインストール](http://www.kkaneko.jp/rinkou/javaintro/cdt.html)の
「C/C++ 開発ツール (CDT) のインストール手順 」を参考に実施

###NDKのインストール
[Ubuntu で Android NDK を使ってみる ](http://www.kkaneko.jp/rinkou/js/andk.html)を参考に実施

#FFmpegライブラリ移植
今回は、FFmpegのAndroid向けビルドパッケージ[halfninja:android-ffmpeg-x264](https://github.com/halfninja/android-ffmpeg-x264)の
Forkリポジトリから[m4fg:android-ffmpeg-x264](https://github.com/m4fg/android-ffmpeg-x264)をお借りしました。

###Gitインストール

```bash
sudo apt-get -yV install git-core
```

###Gitからm4fg:android-ffmpeg-x264をクローン

```bash
git clone https://github.com/m4fg/android-ffmpeg-x264.git --recursive
```

###初期設定

環境変数にNDKのパスが設定されていることを確認して実行
(例：export NDK=/usr/local/android-ndk-r10c)

```bash
cd Project/jni
./create_toolchain.sh
```

###プロジェクトビルド
```bash
./config_make_everything.sh
ndk-build
```
ビルド正常終了後、libs/armeabi/videokit.soができることを確認します。

###Eclipseにインポート

[Eclipseにソースコードを取り込むには](http://www.adakoda.com/android/000220.html)

###AndroidManifest.xmlにパーミッションを追加

```xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
```

###Videokit.javaを少しだけ修正

```java
package uk.co.halfninja.videokit;

public final class Videokit {

  static {
    System.loadLibrary("videokit");
  }
  
//public native void run(String[] args);
  public native void run(String args);

}
```

###FFmepgコマンド実行

[一定の時間間隔でオーバーレイ画像を表示する方法:superuser](http://superuser.com/questions/713498/how-to-show-overlay-image-in-a-certain-time-span-with-ffmpeg)

Android端末の/mnt/sdcardに
ウォーターマークを追加する動画(sample.mp4)と画像(sample.png)を設置して、
下記のメソッドを実行します。

```java
import uk.co.halfninja.videokit.Videokit;
```

```java
	Videokit videoKit = new Videokit();

	String strj = new String("ffmpeg\n");
	strj = strj + "-i\n/mnt/sdcard/sample.mp4\n";
	strj = strj + "-i\n/mnt/sdcard/sample.png\n";
	strj = strj + "-filter_complex\n[0:v][1:v]overlay=main_w-overlay_w-10:main_h-overlay_h-10[out]\n";
	strj = strj + "-map\n[out]\n";
	strj = strj + "-map\n0:a\n";
	strj = strj + "-codec:a\ncopy\n";
	strj = strj + "/mnt/sdcard/output.mp4";
	videoKit.run(strj);
```

/mnt/sdcardにoutput.mp4が出力されていれば成功です。