SoundPoolとMediaPlayerについてのまとめ
色々ややこしいのでまとめメモ
●SoundPoolについて
■メリット
- 楽器アプリにあるような連打が割と普通に実装出来る
■デメリット
- 尺が長い曲が苦手。というか扱えない。6秒くらいで音が切れる。
- 3gpで再生出来ない?mp3は不安定らしい。oggが無難。
- loadが遅い。「setOnLoadCompleteListener」がAPI8(2.2)からしか使えない。
■処理の流れ(だいたい)
SoundPool sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
int soundId = sp.load(getApplicationContext(), resourceId, 1);
//int soundId = sp.load("", 0);
stream_id = sp.play(soundId, 1.0F, 1.0F, 0, 0, 1.0F);
sp.stop(stream_id);
sp.release();
※playする時にloadの返り値が必要みたいです。
※stopする時にplayの返り値が必要みたいです。
■参考になったサイト
●MediaPlayerについて
■メリット
- 尺が長い曲でも再生できる。これに尽きる。音楽プレイヤーとかはこれ使ってるのかな。
- 3gpで再生出来る。携帯だと多いの?よく知らない。
■デメリット
- 連打が苦手。複数インスタンスでやってもスムーズに連打出来ない(Xperia1.6)。
- 具体的に処理が遅いのは、mp.stop()とかmp.prepare()とかが重い。
- Thread使ったらもっと早く出来るのかなー。
- 2.1なら複数インスタンスでやれば割といけそうな感触。
- oggファイルを使うとseekTo(0)で最初に戻れない。謎です。(後述)
■処理の流れ(だいたい)
MediaPlayer mp = MediaPlayer.create(Context, resouceId);
mp.start();
mp.pause();
mp.stop();
mp.relase();
処理の順番はAndroid公式dev見るといいです。
※MediaPlayerのインスタンスは4つが上限らしい
※曲を入れ替えるならmp.setDataSource(this, uri);を使う
※uriはUri.parse("android.resource://" + this.getPackageName() +"/" + resourceId);とかを使えばよさげ。
■参考になったサイト
どれもonResume()でload処理をしてもいいかも。
●oggファイルについて
oggファイル作成時の問題かもしれないけど、MediaPlayerで読み込んだoggファイルをseekTo(0)しても頭出し(巻き戻し)出来ない。
プログラムの問題かと思ってmp.setLooping(true)で曲を繰り返してみたけど、やっぱり1回目だけOKで、2回目以降は最初に戻れてない。
もしこれがoggファイルの特性である場合、oggはSoundPoolで再生した方が無難かも。
↑(特性ではない。ファイルエンコードの問題っぽい。ですよね。)
まあseekTo(0)を使わない仕様でいいなら問題ない。
頭出し(seekTo(0)に対応したoggファイルは容量が大きくなるらしい。
でも総合的に音はoggファイルがよさげ。
MediaPlayerでもSoundPoolでも使えて、ライセンス的に商用もいけるっぽいです。=>Ogg Vorbis解説
嘘ついてる部分があったらご指摘ください(・∀・)