2017-01-03 2 views
0

Я использую MediaPlayer от Android для создания аудиофайлов. Я поставил медиаплеер зацикливание сМедиаплеер для Android: почему звуковая петля не синхронизируется с метроном, играющим на одном и том же BPM?

mMediaPlayer.setLooping(true); 

После нескольких повторений, цикл начинается раньше, чем он должен делать то, если я играю ту же петлю на компьютере, с метрономом работает независимо друг от друга, в том же BPM, как петли, Медиаплеер Android и метроном остаются синхронизированными для нескольких баров, но после пары циклов петля, играющая с приложением, запускается слишком рано.

Я читал о других народах, жалующихся на эту проблему.

я воспроизвести эту проблему как на Android 4.4 и Android 6

Вот минимальный Android проект для воспроизведения проблемы: https://drive.google.com/open?id=0B9FRLIzBQgR1WWdMU29ZcHdsMXc

ответ

0

Я также столкнулся с этой проблемой ... в Mediaplayer

Существует пара решений:

1.use ogg формат звуковой файл (https://en.wikipedia.org/wiki/.ogg)

2.Can использование Soundpool него имеет циклическую и кэширование для медиа-игр (https://developer.android.com/reference/android/media/SoundPool.html)

3.Also вы можете использовать следующий класс: он инициализировать новый медиаплеер, как только первый finishes..so задержка менее более очевидно

public class LoopMediaPlayer { 

    public static final String TAG = LoopMediaPlayer.class.getSimpleName(); 

    private Context mContext = null; 
    private int mResId = 0; 
    private int mCounter = 1; 

    private MediaPlayer mCurrentPlayer = null; 
    private MediaPlayer mNextPlayer = null; 

    public static LoopMediaPlayer create(Context context, int resId) { 
     return new LoopMediaPlayer(context, resId); 
    } 

    private LoopMediaPlayer(Context context, int resId) { 
     mContext = context; 
     mResId = resId; 

     mCurrentPlayer = MediaPlayer.create(mContext, mResId); 
     mCurrentPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      @Override 
      public void onPrepared(MediaPlayer mediaPlayer) { 
       mCurrentPlayer.start(); 
      } 
     }); 

     createNextMediaPlayer(); 
    } 

    private void createNextMediaPlayer() { 
     mNextPlayer = MediaPlayer.create(mContext, mResId); 
     mCurrentPlayer.setNextMediaPlayer(mNextPlayer); 
     mCurrentPlayer.setOnCompletionListener(onCompletionListener); 
    } 

    private MediaPlayer.OnCompletionListener onCompletionListener = new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mediaPlayer) { 
      mediaPlayer.release(); 
      mCurrentPlayer = mNextPlayer; 

      createNextMediaPlayer(); 

      Log.d(TAG, String.format("Loop #%d", ++mCounter)); 
     } 
    }; 
} 

использовать его просто называют

LoopMediaPlayer.create(context, R.raw.sound_file_name); 

вместо mp.setLooping(true);

+1

'1.use ogg формат звук файл'. Мы не должны ограничивать использование пользователем такого формата для нашего приложения. – Kaushal28

+0

если звуковой файл находится в исходной папке приложения ... полезно использовать ogg вместо mp3 для бесщелевого звукового цикла. I означает, что – rafsanahmad007

+0

да, это правда. Согласитесь – Kaushal28

1

В моем проекте у меня была одна и та же проблема, и я нашел его решение в SO где-то, я точно не помню, где именно. Но вот что я сделал:

Вы можете попробовать использовать обработчик для установки стремиться к началу х миллисекунд до конца файла

loopTimer = new Timer(); 
loopTask = new TimerTask() {    
    @Override public void run() { 
     mMediaPlayer.seekTo(0); 
    } 
}; 
long waitingTime = mMediaPlayer.getDuration()-mLoopingPreview; 
loopTimer.schedule(loopTask, waitingTime, waitingTime); 

Теперь просто установить mLoopingPreview в какой-то разумное значение времени. Я использую 80 мс.

+0

Спасибо за ваш ответ. Это немного улучшает ситуацию, но все же кажется, что до тех пор, пока файл не будет повторен, все еще кажется, что он немного затухает. Вы также заметили это? Любое обходное решение? – matdev

+0

попробуйте увеличить этот mLoopingTime до некоторого более высокого значения, например, 110 @matdev – Kaushal28

+0

или попытайтесь уменьшить его. Все, что подходит вам. – Kaushal28

Смежные вопросы