gooブログはじめました!

写真付きで日記や趣味を書くならgooブログ

android mp3およびoggファイルのループ再生

2010-10-16 21:27:37 | android

android mp3およびoggファイルのループ再生

<form>

android mp3およびoggファイルのループ再生

mp3を使用したゲーム等を作成した場合、無料ならライセンス料はかからないが有料にするとライセンス料金がが必要になるためできればサウンドはoggファイルを使用する。oggファイルは商用利用可能なライセンスのため、
ライセンス料金や制約を気にする必要はない。そのためandroidでoggファイルを再生するにはMediaPlyerクラスを使用する。
androidでmp3,oggファイルを再生するためにはMediaPlayerクラスを使用する。注意点としてはmp3を使用する場合で
MediaPlayer.createを使用する場合はMediaPlayer.prepare()メソッドを呼ばす,assetsフォルダ下のmp3、oggファイルを再生する場合はMediaPlayer.prepare()メソッドが必要という事。
Mediaplayerのmanualには「Convenience method to create a MediaPlayer for a given Uri. On success, prepare() will already have been called and must not be called again.」と記述されていた。
/data/data/パッケージ名/の下でしか、ファイルの読み込み、書き込みとうができないため
ogg,mp3ファイルはassetsフォルダもしくはresource/rawフォルダを作成してその下に格納する必要がある。


ogg,mp3でも共通に呼び出すためには下記のように使用する


//resource/assets/music/の下にmp3,oggファイルがある どちらもloop再生可能
//final AssetFileDescriptor assetFileDescritor = m_Context.getAssets().openFd( "music/est_battle2.mp3" );    
final AssetFileDescriptor assetFileDescritor = m_Context.getAssets().openFd( "music/wagner_the_ride_of_the_valkyries.ogg" );

media2.reset();
media2.setDataSource( assetFileDescritor.getFileDescriptor(),
assetFileDescritor.getStartOffset(), assetFileDescritor.getLength() );
media2.setLooping(true);

media2.setAudioStreamType(AudioManager.STREAM_MUSIC);
assetFileDescritor.close();
media2.prepare();   
media2.start();


mp3のライセンス
mp3のライセンス料金が必要になるのはドイツのFraunhofer-Gesellschaft社とフランスのThomson社が発明した音声圧縮アルゴリズム(mp3のデコード)を使用する場合で
Lame(LAME Ain't an MP3 Encoder)を利用した場合はライセンス料金は必要ない。
Lameは上記の会社の音声圧縮アルゴリズムを使用しないで、mp3にデコードしているため。
普通にmp3ファイルのtagをみてもどちらのアルゴリズムを使用しているかは分からないので
結局,面倒な事を回避するために音楽も配布する場合は、oggファイルがベストな選択
だと思う。



以下がサンプル。android sdk 2.1  Desire 2.2で mp3,oggどちらもループ再生できることを確認

<textarea rows="8" cols="75" readonly="readonly">package org.jp.MediaPlayerTest; import android.app.Activity; import android.content.Context; import android.content.res.AssetFileDescriptor; import android.os.Bundle; import android.media.AudioManager; import android.media.MediaPlayer; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.Window; import android.view.View.OnClickListener; import android.widget.Button; import java.io.File; import java.io.IOException; public class MediaPlayerTest extends Activity {     /** Called when the activity is first created. */     @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main); android.view.View b = this.findViewById( R.id.btn1 ); android.view.View b2 = this.findViewById( R.id.btn2 ); android.view.View b3 = this.findViewById( R.id.btn3 ); android.view.View b4 = this.findViewById( R.id.btn4 ); android.view.View b5 = this.findViewById( R.id.btn5 ); android.view.View b6 = this.findViewById( R.id.btn6 ); ClickListener listener = new ClickListener(); b.setOnClickListener( listener ); b2.setOnClickListener( listener ); b3.setOnClickListener( listener ); b4.setOnClickListener( listener ); b5.setOnClickListener( listener ); b6.setOnClickListener( listener ); Button bb = (Button)b; bb.setText( "play assets ogg file  play loop" ); Button b22 = (Button)b2; b22.setText( "play res/raw mp3 file play loop" ); Button b33 = (Button)b3; b33.setText( "stop" ); Button b44 = (Button)b4; b44.setText("MusicPlayerMgr test" ); Button b55 = (Button)b5; b55.setText("MusicPlayerMgr stop" ); listener.SetContest( this );     } } class ClickListener implements OnClickListener { private Context m_Context; private static String strAssetspath = ""; private static MediaPlayer m_mediaPlayer; public void SetContest(Context cnt) { m_Context = cnt; } public void onClick(View v) { MediaPlayer mediaPlayer = new MediaPlayer(); switch (v.getId()) { case R.id.btn1: Log.d("meida","btn1 click"); try { //ogg file loop ok final AssetFileDescriptor assetFileDescritor = m_Context.getAssets().openFd( "music/wagner_the_ride_of_the_valkyries.ogg" ); mediaPlayer.setDataSource( assetFileDescritor.getFileDescriptor(), assetFileDescritor.getStartOffset(), assetFileDescritor.getLength() ); mediaPlayer.prepare(); mediaPlayer.setLooping(true); mediaPlayer.start(); } catch(Exception e) { } break; case R.id.btn2: Log.d("meida","btn2 click"); //MediaPlayer mediaPlayer = new MediaPlayer(); try { //androidでは/data/data/パッケージ名/ の下にしかアクセスできないため //res/rawの下にoggファイルを配置してみたが、再生されなかった //String dst = "/data/data/" + this.getPackageName() + "/dst.txt" // resouce/raw/wagner_the_ride_of_the_valkyries.oggは再生されない。nullはかえらないが再生はされない //mediaPlayer = MediaPlayer.create( m_Context, R.raw.wagner_the_ride_of_the_valkyries ); //mp3 ok mediaPlayer = MediaPlayer.create(  m_Context, R.raw.est_battle2 ); //mediaPlayer.prepare();  //mp3再生の場合、prepareをやるとmediaPlayerがnullになる mediaPlayer.setLooping(true); mediaPlayer.start(); } catch(Exception e) { //MediaPlayer.prepare()を実行した場合, nullが返却される Log.d("meida","btn2 click:" + e.getMessage()); } break; case R.id.btn3: Log.d("meida","btn3 click"); mediaPlayer.stop(); break; case R.id.btn4: Log.d("meida","btn4 click"); break; case R.id.btn5: Log.d("meida","btn5 click"); MusicPlayerMgr.stop( 0 ); break; case R.id.btn6: Log.d("meida","btn6 click"); try { //resource/assets/music/の下にmp3,oggファイルがある どちらもloop再生可能 //final AssetFileDescriptor assetFileDescritor = m_Context.getAssets().openFd( "music/est_battle2.mp3" ); final AssetFileDescriptor assetFileDescritor = m_Context.getAssets().openFd( "music/wagner_the_ride_of_the_valkyries.ogg" ); media2.reset(); media2.setDataSource( assetFileDescritor.getFileDescriptor(), assetFileDescritor.getStartOffset(), assetFileDescritor.getLength() ); media2.setLooping(true); media2.setAudioStreamType(AudioManager.STREAM_MUSIC); assetFileDescritor.close(); media2.prepare();  media2.start(); } catch ( Exception e ) { // TODO 自動生成された catch ブロック e.printStackTrace(); Log.d("meida","btn6 clicked" + e); } break; case R.id.btn7: Log.d("meida","btn7 click"); break; } } }; </textarea>

</form>

2 コメント

コメント日が  古い順  |   新しい順
typo (通りすがり)
2017-09-10 16:26:38
書き込みとうができないため
      ↓
書き込み等ができないため
返信する
typo (通りすがり)
2017-09-10 16:30:56
MediaPlayer.prepare()メソッドを呼ばす
                    ↓
MediaPlayer.prepare()メソッドを呼ぶ
返信する

コメントを投稿