主にandroidとかのメモ

MediaPlayerのギャップレス再生(API Level:16)

6/30(土)に日本androidの会横浜支部の定例会でもくもくしてきたので、その内容をメモ。

#いきなりADT20で新規プロジェクト作れないループにはまって時間半分失ったという

それは置いておいてGalaxyNexusにAndroid4.1焼いたので、出たばかりのAPI Level 16使ってみよう実験。

音系という事でMediaplayer。

音楽プレイヤーを作る時、普通に作ると、1曲再生し再生完了を検出したら、次の曲を再生する。

(あまり機会は無いけど)NonStop系の楽曲を聴く場合、CDで聞くとつなぎ目が無く再生されるのに、Androidでこの方法で再生すると繋がらない。体感ざっくりで500[ms]程度は無音が入って台無し。

API Level:16(Android4.1)で追加された、setNextMediaPlayer()を使ってみた。
説明に「as seamlessly as possible」と書かれていたから、これはギャップレス再生ができるのかな?と。

まずはいままでのやりかた。
music1が1曲目、music2が2曲目のコンテンツファイル(mp3とかoggとか)とすると。
MediaPlayerに読み込ませてstart()する。
2曲目の再生遅延を無くすために2曲目も読み込ませておく。

MediaPlayer mPlayer,mPlayer2;
などしておいて、


mPlayer=MediaPlayer.create(this, music1);
mPlayer.start();
mPlayer.setOnCompletionListener(this);
mPlayer2=MediaPlayer.create(this, music2);

1曲目の再生終了を検出するため、setOnCompletionListener登録しておく。

@Override
public void onCompletion(MediaPlayer mp) {
    mPlayer2.start();
    Toast.makeText(this, "onCompletion", Toast.LENGTH_SHORT).show();
}

再生完了するとonCompletionが呼ばれるので、そこですかさず2曲目をstart()する。

これを下記のように作り直した。

mPlayer=MediaPlayer.create(this, music1);
mPlayer.start();
//mPlayer.setOnCompletionListener(this);

mPlayer2=MediaPlayer.create(this, music2);
mPlayer.setNextMediaPlayer(mPlayer2);

これで1曲目再生完了後、2曲目が自動で再生されます。

GalaxyNexusで再生すると、連続再生されました。(ユーロビートのNonStopMixのCDを発掘したのを使った)
ただ一瞬プチッと切れたのが分かります。 ※最後の補足参照の事[12/7/5追記]
このへんが「as seamlessly as possible」なのだろうと。
端末毎に違いが出る可能性はありますね。

尚、onCompletionは不要です。
onCompletion登録しても、従来どおり呼ばれます。
ただ、2重に再生startしても無駄です。

4.1未満ならsetNextMediaPlayer設定しない、onCompletionで次の曲再生する。
4.1以上ならsetNextMediaPlayer設定し、onCompletionは何もしない(もしくはsetOnCompletionListener登録しない)
など処理を分けるといいかもですね。

※補足追記[12/7/5]
うっかりMP3でやったため音が切れていたことが判明(mp3はパディング入る)
oggで実施すると切れない事が確認できました。

つづきはWebで!(その2の意)
https://init0.net/wp/archives/419