1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

MediaPlayer - Mehrere Sounds

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Tom299, 03.01.2012.

  1. Tom299, 03.01.2012 #1
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Hi,

    in meiner App hab ich ein paar Soundeffekte vorgesehen, die z.B. beim drücken eines Buttons oder Menüs etc. abgespielt werden sollen.

    Jetzt habe ich hier Media Playback | Android Developers gelesen, daß der Media Player die bevorzugte Klasse für das Abspielen von Sounds ist (This class is the primary API for playing sound and video).

    Mein Problem ist nun, daß ich nicht weiß, wie ich mehrere Sounds in den MediaPlayer reinbekomme:

    Code:
            final MediaPlayer mediaPlayerHit;
            mediaPlayerHit = MediaPlayer.create(FindItCloneActivity.this, R.raw.collision8bit);
            mediaPlayerHit.setLooping(false);
            
            final MediaPlayer mediaPlayerFailure;
            mediaPlayerFailure = MediaPlayer.create(FindItCloneActivity.this, R.raw.robot_noise);
            mediaPlayerFailure.setLooping(false);
    
    Bei .create kann man ja nur 1 resource angeben, bei meinen Tests mußte ich also für 2 Sounds 2 MediaPlayer benutzen, was mir doch etwas spanisch vorkommt. Ich finde in der API aber irgendwie nichts, wie ich mehrere Sounds hinzufügen könnte? Oder ist das gar nicht möglich?

    Zur Zeit benutze ich daher die SoundPool-Klasse:
    Code:
    private SoundPool soundPool;
    .
    .
    .
    		soundPool = new SoundPool(2, AudioManager.STREAM_MUSIC, 0);
    		soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
    			@Override
    			public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
    				loaded = true;
    			}
    		});
    		
    		soundHit = soundPool.load(this, R.raw.bottle, 1);
    		soundFail = soundPool.load(this, R.raw.beep, 1);
    
    .
    .
    .
        private void playSound(int soundID) {
    		if (loaded) {
    			soundPool.play(soundID, volume, volume, 1, 0, 1f);
    		}    	
        }
    
    Das funktioniert auch soweit einwandfrei, aber wenn der MediaPlayer der bevorzugte Player ist, würd ich den schon gerne verwenden. Kann mir jemand weiterhelfen oder sollte ich einfach beim SoundPool bleiben?


    Grüße,
    Tom
     
  2. funcoder, 03.01.2012 #2
    funcoder

    funcoder Erfahrener Benutzer

    Beiträge:
    218
    Erhaltene Danke:
    38
    Registriert seit:
    15.08.2009
    Wenn es dir primär um kurze Soundeffekte geht solltest du beim Soundpool bleiben. Die Sound-Files werden dabei im Speicher gehalten, was gerade dem häufigen abspielen von kurzen Sounds ( < 10 sek) entgegen kommt.

    Der MediaPlayer ist vorzugweise für große Dateien/Streams gedacht. Dieser hält die Files nicht im Speicher sondern streamt diese jeweils zur Laufzeit.
    Das hat den Vorteil das es egal wie groß die Datei ist es eigentlich niemals zu einer OutOfMemory-Exception kommen kann. Das allerdings auf Kosten einer höheren CPU-Belastung beim abspielen der Datei.

    In deinem Fall würde ich also, sofern es dir um Menü/Button Sounds geht beim Soundpool bleiben.
     
    Tom299 bedankt sich.
  3. Tom299, 03.01.2012 #3
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Danke für die Info, vielleicht häng ich ja auch zu sehr an der Vorstellung, daß der Windows Media Player eine Playlist bietet und man die Lieder wechseln kann und die Klasse hier heißt nun auch mal Media Player ;-)

    Aber ja, meine Sounds sind sehr kurz, <=1s, also eher kurze Effekte, von daher bleib ich dann beim SoundPool.

    Wie wäre es aber, wenn ich z.B. eine Hintergrundmusik laufen lassen möchte und trotzdem die kurzen Effektsounds benutzen will. Nehm ich dann den Mediaplayer für die Hintergrundmusik und SoundPool für die Effekte oder kann ich da auch komplett beim SoundPool bleiben und gleichzeitig den MusikStream + die Sounds abspielen?
     
  4. funcoder, 03.01.2012 #4
    funcoder

    funcoder Erfahrener Benutzer

    Beiträge:
    218
    Erhaltene Danke:
    38
    Registriert seit:
    15.08.2009
    Yep, ich machs genauso. :)
    Für die Vielzahl an kurzen Sounds nehme ich den Soundpool aber parallel dazu für die Hintergrundmusik nehme ich eine MediaPlayer-Instanz.
    Das funktioniert auch gut und dadurch das nur ein MediaPlayer-Objekt im Einsatz ist, beeinträchtigt diese Kombination die Performance kaum.

    Je nachdem wie stark deine App den Heap beansprucht könntest du auch versuchen die Hintergrundmusik über den SoundPool zu regeln.
    Der SoundPool bietet ja auch die Möglichkeit eine Endlosschleife zu legen.
     
  5. Tom299, 03.01.2012 #5
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Alles klar, dann werd ich zuerst mal den Mix aus MediaPlayer für Hintergrundmusik und SoundPool nur für die Soundeffekte implementieren :)
     

Diese Seite empfehlen