作成者別アーカイブ: take

Android用 FFmpeg を利用した Androidアプリ

タグ: , | 投稿日: 投稿者:

お久しぶりです。
takeです。

前回の記事はこちら

前回 libffmpeg.so のビルドが完了したので、今回はこのライブラリを使ってJNI部分を作成します。

JNIを作成するため、Eclipse(luna)に以下の設定が必要です。
・C/C++開発環境(Help->Install New Software)
http://download.eclipse.org/releases/luna を入力し、以下を選択する
・Programming Languages -> C/C++ Development Tools
・Programming Languages -> C/C++ Development Tools SDK
・Programming Languages -> C/C++ Library API Documentation Hover Help

・NDKプラグインのインストール(Help->Install New Software)
https://dl-ssl.google.com/android/eclipse/ を入力し、以下を選択する
・Developer Tools -> Android Native Development Tools

・NDKの設定(Window->Preferences->Android->NDK)
前回の記事でNDKを展開したディレクトリを指定します。

以上で設定は終わりです。

次は、プロジェクトを作成します。
File -> New -> Android Application Project を選択します。
アプリケーション名を適当にいれてプロジェクトを作ります。

プロジェクト作成後、プロジェクトメニューから Android Tools -> Add Native Support を選択します。
JNIフォルダが作成されて準備ができました。

ここからが大変です。自分も試行錯誤した結果なので誤ってる個所があるかもしれませんがご容赦ください。

まず、FFMpegライブラリのコピーを実施します。
・jniフォルダにlibフォルダを作成します。
・build/ffmpeg/armv7/libffmpeg.so を jni/lib へ
・build/ffmpeg/armv7/include を jni/include へ

JNIフォルダにある Android.mk ファイルを編集します。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg
LOCAL_EXPORT_C_INCLUDES := include
LOCAL_SRC_FILES := lib/libffmpeg.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := FFMpegTest
LOCAL_SRC_FILES := FFMpegTest.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_LDLIBS := -llog -ljnigraphics -lz -landroid  -ldl
LOCAL_SHARED_LIBRARIES := ffmpeg
include $(BUILD_SHARED_LIBRARY)

$(call import-module,android/cpufeatures)

※今回のプロジェクトはFFMpegTestとしています。

編集内容を保存後、プロジェクトメニューから「Build Project」を実施すると
JNIライブラリが作成されているはずです。
(I/Fがないのでなにもできませんが。。。)

長くなってしまったので、続きはまた次回!!


Android用 FFmpeg を ビルド

タグ: | 投稿日: 投稿者:

お久しぶりです。
takeです。

今回は、FFmpeg-Android を centos6.5 でビルドするまでを記述したいと思います。

まず、必要なアイテムをダウンロードしてきます。

※NDKの展開等はここでは割愛します。

環境変数ANDROID_NDKを設定し、FFmpeg-Android ディレクトリ配下にある「FFmpeg-Anroid.sh」を起動(ビルド)します。
sudo ./FFmpeg-Android.sh

あれ?なんかANDROID_NDKの環境変数がうまく読み込めなくてエラーになってやがる。
しょうがないので、FFmpeg-Android.shを編集して、export ANDROID_NDK=xxxxx を追記。
で、またビルド!オラッ!!

途中のログで(たまたま見てた)、ccacheが無い!!とかエラーがでてたので、以下のコマンドでインストール。
sudo yum install --enablerepo=epel ccache
で、またビルド!オラッ!!

ログはあんまり見てなかったけど(すごい時間かかるので見てられない)、完走したので大丈夫かな?
意外とすんなりいけてびっくり!

次回は、今回作成したlibffmpeg.soを使用して、Androidアプリを作ってみたいと思います。

では。


Androidでネットワーク状態を知る

タグ: | 投稿日: 投稿者:

takeです。

弊社の動画配信サービスをAndroidで利用する際、現在のネットワーク状態により
配信する動画のビットレートを決定していたのですが。。。

当初のアプリ配信時には、ネットワーク状態は3GとWifiしかなくてWifiなら高ビットレート、
3Gなら低ビットレートを選択みたいな事をアプリからやってました。
が、時代の流れとは早いもので昨今ではWiMAX(+WiMAX)やらLTEやら新しいネットワークが増えてきました。

ユーザにとっては回線速度があがってとってもありがたい話しなんですが、開発者にとっては
たまったもんじゃありません(汗
上記のように3GとWifiのみで判定していると、プログラムの組み方によっては高速回線であるはずの
WiMAXやLTEが『3G』と判断されて画質の悪い低ビットレートの動画が配信されてしまいます。

この状態を回避する為に、正しいネットワーク状態を取得してみましょう。

まず、ネットワーク情報を取得する為、AndroidManifest.xml に以下のコードを記述します。

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

これでネットワーク状態を取得する準備ができました。

次は、取得メソッドです。

public enum NetworkStatus {
   OFF,
   MOBILE,
   WIFI,
   WIMAX,
   LTE,
}

public NetworkStatus getConnectedState(Context context) {

	ConnectivityManager manager = (ConnectivityManager)context.getSystemService(CONNECTIVITY_SERVICE);
	NetworkStatus status = NetworkStatus.OFF;

	NetworkInfo info = manager.getActiveNetworkInfo();
	if (info == null || info.isConnected() != true) {
		// OFF
		return status;
	}

	switch (info.getType()) {
	case ConnectivityManager.TYPE_WIFI:			// Wifi
		status = NetworkStatus.WIFI;
		break;
	case ConnectivityManager.TYPE_MOBILE_DUN:	// Mobile 3G
	case ConnectivityManager.TYPE_MOBILE_HIPRI:
	case ConnectivityManager.TYPE_MOBILE_MMS:
	case ConnectivityManager.TYPE_MOBILE_SUPL:
	case ConnectivityManager.TYPE_MOBILE:
		switch (info.getSubtype()) {
		case TelephonyManager.NETWORK_TYPE_LTE:
			status = NetworkStatus.LTE;			// LTE
			break;
		default:
			status = NetworkStatus.MOBILE;		// Mobile 3G
			break;
		}
		break;
	case ConnectivityManager.TYPE_WIMAX:		// Wimax
		status = NetworkStatus.WIMAX;
		break;
	}
	return status;
}

一応これで取得できるはずなんですが、LTEを判定できるのは API Level 11(Android3.0) からなんです。
Galaxy S II LTE SC-03D みたいな Android2.3なのにLTE搭載機は正常に判定できるかわかりません。

では。


[MySQL]複数レコードを集約!!

タグ: | 投稿日: 投稿者:

あけましておめでとうございます。
takeです。

Web制作をしてる際、DBの複数レコードを1行に集約した結果を表示したい!!
って時がまれにあります。

View側でループし、複数レコードを1行に表示するように小細工してもいいのですが、
MySQLには「GROUP_CONCAT」という集約関数があります。

詳しくはここ

では、早速試してみましょう。

1.社員と部署の関係を持つテーブルを作成します。
20140108_01
作成した結果はこれ。
20140108_02
20140108_03
20140108_04

2.各テーブルにデータを設定します。
20140108_05

3.抽出した結果。
20140108_06

見てのとおり、john以外の人は複数の部署に所属しているので、複数レコード抽出されています。
この複数行の結果を、1行に集約する為に「GROUP_CONCAT」関数を使用します。

20140108_07

例にも示したとおり、「GROUP_CONCAT」内でorder by が使えます。
この他にも、group by 等も使えますので、かなり使い勝手はよいと思います。