2013-11-14 4 views
3

Мне нужно зацикливать звук в фоновом режиме без пробелов. Я пробовал много решений, какMediaplayer setNextPlayer

SoundPool (-1 for loop) 
AudioTrack 
Mediaplayer 

но не нашел лучшее решение

теперь я реализовано

setNextMediaPlayer() 

как этот

 public void createDefaultPlayer() 
     { 
      defaultBgSound1 = MediaPlayer.create(getApplicationContext(), getResources().getIdentifier("raw/" + file, "raw", getPackageName())); 
      defaultBgSound2 = MediaPlayer.create(getApplicationContext(), getResources().getIdentifier("raw/" + file, "raw", getPackageName()));     
      defaultBgSound1.setNextMediaPlayer(defaultBgSound2); 
      defaultBgSound1.start(); 
     } 

он играет на следующий звук, но я хочу продолжить этот цикл навсегда

любой лучший способ цикла это

ответ

2

Несколько идей:

1) Это, как я думаю, что вы предложили может работать:

Start именно так, как вы есть, подготовив два MediaPlayer экземпляров с тем же носителем.

Звоните setNextMediaPlayer при каждом передании другого в качестве параметра.

В обратном вызове onCompletion для каждого, позвоните по телефону stop() и prepareAsync() на себя. Это должно вернуть его в подготовленное состояние, которое, как я полагаю, ожидает механизм setNextMediaPlayer. Если звук является локальным ресурсом и имеет достаточную продолжительность, не должно быть проблем с этим подходом, хотя вы можете использовать обратный вызов onPrepared, чтобы помочь проверить время, если оно есть.

В качестве альтернативы вы можете просто позвонить seekTo(0) в обратном вызове onCompletion, который должен быть быстрее метода stop()/prepareAsync(). Однако, я думаю, что может не работать должным образом с setNextMediaPlayer, так как он оставляет MediaPlayer в завершенном состоянии. (Я не уверен, потому что я никогда не пробовал это.)

Не думаю, что следующий MediaPlayer не будет установлен, поэтому я не думаю, что вам нужно будет позвонить setNextMediaPlayer более одного раза за экземпляр , Но если вы это сделаете, используйте обратный вызов onPrepared, чтобы каждый MediaPlayer установил другой в качестве следующего игрока.

2) Используйте один MediaPlayer и позвоните seekTo(0) и start() в обратном вызове onCompletion. Я бы предположил, что это то, что происходит, когда игрок зацикливается, но я не уверен в этом. Возможно, это стоит того.

3) Изучите OpenSL и реализуйте собственный плеер в собственном коде. Этот подход гораздо более интенсивно исследуется, но обеспечивает наибольший контроль :)

+0

спасибо Дэйв, я пробовал многие из них, но не пробовал seekto – farrukh

+0

Работали ли функции seekTo? –

+0

Это не работает таким образом, что я хочу, чтобы это не было гладким – farrukh

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