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