2016-07-14 1 views
2

Je travaille avec la classe mediaplayer dans le studio android. Je veux simplement fondre un son et fondre dans l'autre son au lieu d'utiliser setVolume (0,0) et setVolume (1,1).Android Studio Mediaplayer comment fondre et sortir

J'ai créé deux mediaplayers pour cela et il m'a semblé avoir trouvé une solution dans ce fil: Android: How to create fade-in/fade-out sound effects for any music file that my app plays? mais je ne sais pas comment utiliser deltaTime.

Il y a aussi d'autres solutions à cela, que je peux à peine comprendre. N'y at-il pas un moyen facile de fondre deux mediaplayers, je ne peux pas imaginer que personne n'en a encore besoin ou que tout le monde utilise un code obsessionnel pour y parvenir. Et comment dois-je utiliser deltaTime?

Répondre

2

En regardant le example lié, vous devrez appeler fadeIn()/fadeOut() dans une boucle, pour augmenter/diminuer le volume sur une période de temps. deltaTime serait le temps entre chaque itération de la boucle.

Vous devez le faire dans un thread distinct de votre thread d'interface utilisateur principal, afin de ne pas le bloquer et provoquer le blocage de votre application. Vous pouvez le faire en mettant cette boucle dans un nouveau Thread/Runnable/Timer.

Voici mon exemple pour la décoloration dans (vous pouvez faire une chose similaire pour la sortie en fondu):

int volume = 0; 

private void startFadeIn(){ 
    final int FADE_DURATION = 3000; //The duration of the fade 
    //The amount of time between volume changes. The smaller this is, the smoother the fade 
    final int FADE_INTERVAL = 250; 
    final int MAX_VOLUME = 1; //The volume will increase from 0 to 1 
    int numberOfSteps = FADE_DURATION/FADE_INTERVAL; //Calculate the number of fade steps 
    //Calculate by how much the volume changes each step 
    final float deltaVolume = MAX_VOLUME/(float)numberOfSteps; 

    //Create a new Timer and Timer task to run the fading outside the main UI thread 
    final Timer timer = new Timer(true); 
    TimerTask timerTask = new TimerTask() { 
     @Override 
     public void run() { 
      fadeInStep(deltaVolume); //Do a fade step 
      //Cancel and Purge the Timer if the desired volume has been reached 
      if(volume>=1f){ 
       timer.cancel(); 
       timer.purge(); 
      } 
     } 
    }; 

    timer.schedule(timerTask,FADE_INTERVAL,FADE_INTERVAL); 
} 

private void fadeInStep(float deltaVolume){ 
    mediaPlayer.setVolume(volume, volume); 
    volume += deltaVolume; 

} 

Au lieu d'utiliser deux objets MediaPlayer séparés, je le ferais dans votre cas, utilisez un seul et échanger la piste entre les fondus. Exemple:

**Audio track #1 is playing but coming to the end** 
startFadeOut(); 
mediaPlayer.stop(); 
mediaPlayer.reset(); 
mediaPlayer.setDataSource(context,audiofileUri); 
mediaPlayer.prepare(); 
mediaPlayer.start(); 
startFadeIn(); 
**Audio track #2 has faded in and is now playing** 

Hope this résout votre problème.

+0

Merci, cela aidera puisque je n'ai pas encore trouvé de solution de travail! De plus, l'indication pour lancer ceci sur un nouveau fil est très utile aussi! Merci! – olop01