[Android/Kotlin] MediaPlayerで音が途切れないようにループ再生させる方法

Android

MediaPlayerでisLoopingをtrueにするとループ再生できますが、ループ時に音が途切れてしまいます。

別のMediaPlayerのインスタンスを予め用意しておき、1つ目のMediaPlayerのインスタンスの再生が終わった時にそれを再生することで、音が途切れないようにループ再生させることができるようになります。

ソースコード

以下のページのJavaで書かれたソースコードをKotlinに書き換えました。

Not able to achieve Gapless audio looping so far on Android – Stack Overflow

まだ勉強中で基本的な文法がわかっていないので、参考程度にしてください。一応これで動きます。

import android.content.Context
import android.media.MediaPlayer
import android.util.Log

public class LoopMediaPlayer(context: Context, resId: Int) {
    companion object {
        var TAG: String = LoopMediaPlayer::class.java.simpleName

        public fun create(context: Context, resId: Int): LoopMediaPlayer {
            return LoopMediaPlayer(context, resId)
        }
    }

    private var mContext: Context? = null
    private var mResId: Int = 0
    private var mCounter: Int = 1
    private var mCurrentPlayer: MediaPlayer? = null
    private var mNextPlayer: MediaPlayer? = null

    init {
        mContext = context
        mResId = resId
        mCurrentPlayer = MediaPlayer.create(mContext, mResId)
        mCurrentPlayer?.setOnPreparedListener{
            it.start()
        }
        createNewMediaPlayer()
    }

    private fun createNewMediaPlayer() {
        mNextPlayer = MediaPlayer.create(mContext, mResId)
        mCurrentPlayer?.setNextMediaPlayer(mNextPlayer)
        mCurrentPlayer?.setOnCompletionListener{
            it.release()
            mCurrentPlayer = mNextPlayer
            createNewMediaPlayer()
            Log.d(TAG, String.format("Loop #%d", ++mCounter))
        }

    }
}

呼び出し側。

LoopMediaPlayer.create(context, R.raw.bgm)

Kotlinをある程度身につけたら、ソースコードを見直して書き直します。

広告