2014-01-21 9 views
8

Android 4.xでは、オーディオループアプリケーションのサウンドループに0.2〜0.5秒のギャップがあります。Android MediaPlayerループにOGGフォーマットでもギャップがあります

私のサウンドは非常に大きく(場合によっては2〜3MB)、同時に複数のインスタンスを実行できるため、MediaPlayerを使用しています。

私はこれをかなり調査しましたが、Android 4.xのバグがあります。しかし、私は多くの回避策を試しましたが、いずれも動作していないようです。

  • Audacityを使用してOGGへのすべてのWAVファイル変換さ(10品質レベル2を、それは問題ではありませんでした)setNextMediaPlayer(しようとしました
  • 停止に(0)seekToを使用して
  • を繰り返すようにしようとしました

    public class SoundPlayer implements OnCompletionListener { 
        private MediaPlayer mp = null; 
    
        public void initPlayer() { 
         if(mp == null) { 
          mp = new MediaPlayer(); 
         } 
        } 
    
        public void prepare(Context context, int resource) { 
        initPlayer(); 
        try{ 
         mp.reset(); 
         Uri uri = Uri.parse("android.resource://com.myapp.app/"+resource); 
         mp.setDataSource(context,uri); 
         mp.prepare(); 
         isPrepared = true; 
         mp.setOnCompletionListener(this); 
        } catch(Exception e) { 
         e.printStackTrace(); 
        } 
        } 
    
    
    .......... etc (Uses typical MediaPlayer methods such as stop(), start(), setLooping(true) 
    
    
    } 
    
    :ここで私が使用しているコードのサンプルの独自のバグ

を持って

  • しようとしましたsoundPool

    私は特別なものを使用していないので、誰かがAndroid上でループするバグの回避策を知っているかどうかは不思議です。

  • +0

    誰かを助けることを願っていますが、ギャップが負荷の簡単な遅れや、あなたのMediaPlayerのオブジェクトの再作成することによって引き起こされていませんか? –

    +0

    あなたはエミュレータを使用していますか?私はエミュレータでこれに似た問題がありましたが、実際のデバイスで試してみたところ、遅れはなくなりました。 – Ogen

    +0

    エミュレータではないGS3デバイスを使用しています。それは遅れのように感じるが、どうすればそれを防ぐだろうか? – user3217336

    答えて

    1

    いいえ古い投稿ですが、この解決策は機能します。これはハックのようなものです。誰かがこの答えに来たなら、それは誰かを助けるでしょう。

    私は3つのメディアプレーヤーを使用しています。 mp1,mp2,mp3mp1が再生され、mp2がそのsetNextMediaPlayerに設定されています。 mp1が終了したら、mp3mp2'ssetNextMediaPlayerに設定しました。 mp2が終了したら、mp1mp3'ssetNextMediaPlayerに設定しました。以下は、ポーズ、ストップ、セットvolを再生する完全なコードです。オブジェクトBZMediaPlayerを作成し、uriまたはリソースIDを指定して起動してください。

    import android.content.Context; 
    import android.media.MediaPlayer; 
    import android.media.MediaPlayer.OnCompletionListener; 
    import android.net.Uri; 
    import android.util.Log; 
    
    public class BZMediaPlayer { 
    
    
        private Context context; 
        private Uri uri; 
        private int resourceId; 
    
        // which file is getting played 
        public static final int URI_PLAYING = 1; 
        public static final int RESOURCE_PLAYING = 2; 
        private int filePlaying; 
    
        // states of the media player 
        public static final int STATE_PLAYING = 1; 
        public static final int STATE_PAUSED = 2; 
        public static final int STATE_STOP = 3; 
    
        // current state 
        private int state = STATE_STOP; 
    
        // current mediaPlayer which is playing 
        private int mediaPlayerIndex = -1; 
    
        // 3 media players 
        private MediaPlayer mp[] = new MediaPlayer[3]; 
    
        // current volume 
        private float vol; 
    
    
        public BZMediaPlayer(Context context) { 
         this.context = context; 
        } 
    
        /** 
        * plays the provided uri 
        * @param uri 
        */ 
        public void play(Uri uri) { 
         this.uri = uri; 
         // current playing file 
         filePlaying = URI_PLAYING; 
         // stop any playing session 
         stop(); 
    
         // initialize and set listener to three mediaplayers 
         for (int i = 0; i < mp.length; i++) { 
          mp[i] = MediaPlayer.create(context, uri); 
          mp[i].setOnCompletionListener(completionListener); 
         } 
    
         // set nextMediaPlayers 
         mp[0].setNextMediaPlayer(mp[1]); 
         mp[1].setNextMediaPlayer(mp[2]); 
    
         // start the first MediaPlayer 
         mp[0].start(); 
         // set mediaplayer inex 
         mediaPlayerIndex = 0; 
         // set state 
         state = STATE_PLAYING; 
        } 
    
        /** 
        * play file from resource 
        * @param resourceId 
        */ 
        public void play(int resourceId) { 
         this.resourceId = resourceId; 
         filePlaying = RESOURCE_PLAYING; 
         stop(); 
         for (int i = 0; i < mp.length; i++) { 
          mp[i] = MediaPlayer.create(context, resourceId); 
          mp[i].setOnCompletionListener(completionListener); 
         } 
    
         mp[0].setNextMediaPlayer(mp[1]); 
         mp[1].setNextMediaPlayer(mp[2]); 
    
         mp[0].start(); 
         mediaPlayerIndex = 0; 
         state = STATE_PLAYING; 
        } 
    
        /** 
        * play if the mediaplayer is pause 
        */ 
        public void play() { 
         if (state == STATE_PAUSED) { 
          mp[mediaPlayerIndex].start(); 
          Log.d("BZMediaPlayer", "playing"); 
          state = STATE_PLAYING; 
         } 
        } 
    
        /** 
        * pause current playing session 
        */ 
        public void pause() { 
         if (state == STATE_PLAYING) { 
          mp[mediaPlayerIndex].pause(); 
          Log.d("BZMediaPlayer", "pausing"); 
          state = STATE_PAUSED; 
         } 
        } 
    
        /** 
        * get current state 
        * @return 
        */ 
        public int getState() { 
         return state; 
        } 
    
        /** 
        * stop every mediaplayer 
        */ 
        public void stop() { 
         for(int i = 0 ; i < mp.length ; i++) { 
          if (mp[i] != null) { 
           mp[i].stop(); 
    
           if(mp[i].isPlaying()) { 
            mp[i].release(); 
           } 
          } 
         } 
         state = STATE_STOP; 
        } 
    
        /** 
        * set vol for every mediaplayer 
        * @param vol 
        */ 
        public void setVol(float vol) { 
         this.vol = vol; 
         for(int i = 0 ; i < mp.length ; i++) { 
          if (mp[i] != null && mp[i].isPlaying()) { 
           mp[i].setVolume(vol, vol); 
          } 
         } 
        } 
    
        /** 
        * internal listener which handles looping thing 
        */ 
        private MediaPlayer.OnCompletionListener completionListener = new OnCompletionListener() { 
    
         @Override 
         public void onCompletion(MediaPlayer curmp) { 
          int mpEnds = 0; 
          int mpPlaying = 0; 
          int mpNext = 0; 
          if(curmp == mp[0]) { 
           mpEnds = 0; 
           mpPlaying = 1; 
           mpNext = 2; 
          } 
          else if(curmp == mp[1]) { 
           mpEnds = 1; 
           mpPlaying = 2; 
           mpNext = 0; // corrected, else index out of range 
          } 
          else if(curmp == mp[2]) { 
           mpEnds = 2; 
           mpPlaying = 0; // corrected, else index out of range 
           mpNext = 1; // corrected, else index out of range 
          } 
    
          // as we have set mp2 mp1's next, so index will be 1 
          mediaPlayerIndex = mpPlaying; 
          Log.d("BZMediaPlayer", "Media Player " + mpEnds); 
          try { 
           // mp3 is already playing release it 
           if (mp[mpNext] != null) { 
            mp[mpNext].release(); 
           } 
           // if we are playing uri 
           if (filePlaying == URI_PLAYING) { 
            mp[mpNext] = MediaPlayer.create(context, uri); 
           } else { 
            mp[mpNext] = MediaPlayer.create(context, resourceId); 
           } 
           // at listener to mp3 
           mp[mpNext].setOnCompletionListener(this); 
           // set vol 
           mp[mpNext].setVolume(vol, vol); 
           // set nextMediaPlayer 
           mp[mpPlaying].setNextMediaPlayer(mp[mpNext]); 
           // set nextMediaPlayer vol 
           mp[mpPlaying].setVolume(vol, vol); 
          } catch (Exception e) { 
           e.printStackTrace(); 
          } 
         } 
        }; 
    
    } 
    

    は、それが

    Edit: clean code

    +0

    ありがとうございます!しかし、2つのバグがあったので、私はそれに応じてソースコードを編集しました。今すぐ素晴らしい作品!ありがとうございました! – Taifun

    +0

    私はこれを私のゲームで(libGDXを使って)実装しました。私はソースコードから多くのクラスをコピーしなければならなかったし、いくつかのものを食べるが、ここではプリンシパルが動作する。 素晴らしいもの@moonzai –

    +0

    @RussWheeler私の喜びの仲間:-) – moonzai

    関連する問題