June 8, 2012

MediaPlayerでBGMを再生する

MediaPlayerを使ってBGMを再生する方法です。

MediaPlayerは逐次再生するため、長大なファイルであってもメモリ消費量が少ない特徴があります。再生開始の遅延があるため、BGMのような再生開始タイミングの精度を厳しく求めないBGMのような再生に向いています。

再生できるファイルは参考にあるAndroid Supported Media Formatsを見てください。MP3やWAVなど、たいていのオーディオフォーマットはサポートしています。

MediaPlayerを使う注意点は、ステートマシン(つまりMediaPlayerそのものが状態をもっていて、ユーザーがきちんと状態を判断して制御する必要がある)なので、状態を把握して、その状態に応じたAPIを使用しなければなりません。ステートの遷移は参考にあるMediaPlayerから引用すると下記のようになっています。APIを発行するたびに状態が遷移していきます。


再生可能状態にするprepare()は時間のかかる処理のため、同期処理のprepare()だけでなく、非同期処理のprepareAsync()があります。onPrepared()を受け取ることで完了通知を受け取ることができます。また、使用が完了した場合(もう使わない場合)、release()を呼んでリソースを解放する必要があります。これをしないで何度もMediaPlayerを使うとそのうち使用できなくなる可能性があります。

MediaPlayerは再生、停止、一時停止、ループ再生、音量調整など機能もいろいろそろっています。

例)リソースにあるオーディオデータを再生する場合、res/raw/フォルダにデータをおきます。ここではbgm.mp3をおいています。create()は特殊で実行完了するとPrepared状態なので、いきなりstart()を呼ぶだけで再生できます。ループ再生するようにセットも加えています。

public class SampleAppActivity extends Activity {
    private final static String TAB = "SampleAppActivity";
    private MediaPlayer mBgmPlayer;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        mBgmPlayer = MediaPlayer.create(this, R.raw.bgm);
        mBgmPlayer.setLooping(true);
        mBgmPlayer.start();
    }
}

例)SDカードなど外部ストレージにあるファイル(ここでは/sdcard/bgm.mp3)を再生する場合、下記のように指定します。ファイル名をパスで指定しますが、このとき直接"sdcard"と指定せず、あえてEnvironment.getExternalStorageDirectory()でシステムから外部ストレージのフォルダを取得しています。必ずしも外部ストレージが"sdcard"とは限らない(内部ストレージの場合もある)ため、例ではこのようにしています。

public class SampleAppActivity extends Activity {
    private final static String TAB = "SampleAppActivity";
    private MediaPlayer mBgmPlayer;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        mBgmPlayer = new MediaPlayer();
        try {
            mBgmPlayer.setDataSource(Environment.getExternalStorageDirectory().getPath() + "/" + "bgm.mp3");
            mBgmPlayer.prepare();
        } catch (IllegalArgumentException e) {
        } catch (SecurityException e) {
        } catch (IllegalStateException e) {
        } catch (IOException e) {
        }
        mBgmPlayer.start();
    }
}

参考:Android Developers:MediaPlayer
参考:Android Developers:Android Supported Media Formats

No comments:

Post a Comment