2017-02-13 2 views
0

Ich bin ein Spiel in Libgdx machen und ich brauche zwei Melodien gleichzeitig zu spielen. Allerdings funktioniert das Laden und Abspielen von 2 Melodien auf Android nicht. Hier ist ein kleiner Test, den ich gemacht habe. Ich habe sogar versucht, den LibGDX AssetManager zu verwenden, aber immer noch keinen Erfolg.kann nicht 2 Musik-Instanzen auf Android mit Libgdx spielt

Music test1; 
Music test2; 

AssetManager manager = new AssetManager(); 

@Override public void create() 
{ 
    manager.load(Melody.REVERSION.getPath(), Music.class); 
    manager.load(Melody.COLLAPSE.getPath(), Music.class); 

    while (!manager.update()) {} 
    manager.finishLoading(); 

    test1 = manager.get(Melody.REVERSION.getPath()); 
    test2 = manager.get(Melody.COLLAPSE.getPath()); 

    test1.setVolume(1); 
    test1.play(); 
    test2.setVolume(1); 
    test2.play(); 
} 
+0

Möglicherweise verwandt: http://gamedev.stackexchange.com/questions/104893/sounds-overlapping-when-play-too-many-at-the-same-time und http://stackoverflow.com/questions/15742812/ android-gdx-sound-performance-issue –

Antwort

0

Ich verwende derzeit SoundPool-Bibliothek. Mit diesem kann ich verschiedene Soundeffekte gleichzeitig reproduzieren, aber ich weiß nicht, ob es die beste Methode für Musik ist.

Beitrag bezogen werden: Play sound using soundpool example

EDIT Mit Mediaplayer und CyclicBarrier:

public enum MP_COMMAND { 
    START, 
    STOP, 
    PAUSE 
} 

/** 
* Uses threads to execute synced commands for the current video media player and 
* background music player in tandem. 
*/ 
public void syncedCommand(MediaPlayer player1, MediaPlayer player2, MP_COMMAND command) { 
    final CyclicBarrier commandBarrier = new CyclicBarrier(2); 
    new Thread(new SyncedCommandService(commandBarrier, player1, command)).start(); 
    new Thread(new SyncedCommandService(commandBarrier, player2, command)).start(); 
} 

/** 
* Inner class that starts a given media player synchronously 
* with other threads utilizing SyncedStartService 
*/ 
private class SyncedCommandService implements Runnable { 
    private final CyclicBarrier    mCommandBarrier; 
    private  MediaPlayerTest.MP_COMMAND mCommand; 
    private  MediaPlayer    mMediaPlayer; 

    public SyncedCommandService(CyclicBarrier barrier, MediaPlayer player, MediaPlayerTest.MP_COMMAND command) { 
     mCommandBarrier = barrier; 
     mMediaPlayer = player; 
     mCommand = command; 
    } 

    @Override public void run() { 
     try { 
      mCommandBarrier.await(); 
     } catch (InterruptedException | BrokenBarrierException e) { 
      e.printStackTrace(); 
     } 

     switch (mCommand) { 
      case START: 
       mMediaPlayer.start(); 
       break; 

      case STOP: 
       mMediaPlayer.stop(); 
       break; 

      case PAUSE: 
       mMediaPlayer.pause(); 
       break; 

      default: 
       break; 
     } 
    } 
} 

beiden Lieder nennen dies zu spielen:

MediaPlayer mCurrentVideoPlayer = MediaPlayer.create(this, R.raw.track1); 
MediaPlayer mBackgroundMusic = MediaPlayer.create(this, R.raw.track2); 

syncedCommand(mCurrentVideoPlayer, mBackgroundMusic, MP_COMMAND.START); 

Referenz: Playing multiple songs with MediaPlayer at the same time: only one is really playing

+0

Sound und Musik unterscheiden sich in LibGDX. Der Sound ist vollständig in den Speicher geladen und es kann beliebig oft gespielt werden. Sound funktioniert jedoch nur für Dateien unter 1 MB. Normalerweise verwenden Sie Sound für Soundeffekte, wie zum Beispiel eine Schusswaffe, ich muss jedoch Musik verwenden. Musik funktioniert, indem der Inhalt der Musikdatei gestreamt wird. Es verwendet den MediaPlayer im Android-Backend. Musik wird für längere Songs verwendet, die abgespielt werden müssen. Ich brauche 2 Songs gleichzeitig, nicht 2 Sounds. – BananyaDev

+0

Ahh ok, können Sie mit Mediaplayer versuchen, las ich diese: http://stackoverflow.com/questions/26379441/playing-multiple-songs-with-mediaplayer-at-the-same-time-only-one-is- real-pla kann dir vielleicht helfen. – Santi

+0

Wenn Sie MP_COMMAND.START ausführen und schnell eine MP_COMMAND.PAUSE ausführen, wie wird die letzte Aktion abgebrochen, wenn nicht alle Threads beendet wurden? – Billyjoker

Verwandte Themen