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の返り値が必要みたいです。

■参考になったサイト

SoundPool使用上の注意点

SoundPool でサウンド再生 ~ローカル版


●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);を使う

uriUri.parse("android.resource://" + this.getPackageName() +"/" + resourceId);とかを使えばよさげ。

■参考になったサイト

Xperiaでの音の遅延について

MediaPlayerのインスタンスの上限について

株式会社タイトーさんの資料

どれも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解説


嘘ついてる部分があったらご指摘ください(・∀・)