MediaPlayer - Mehrere Sounds

T

Tom299

Stammgast
122
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
 
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.
 
  • Danke
Reaktionen: Tom299
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?
 
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.
 
Alles klar, dann werd ich zuerst mal den Mix aus MediaPlayer für Hintergrundmusik und SoundPool nur für die Soundeffekte implementieren :)
 

Ähnliche Themen

B
Antworten
1
Aufrufe
801
swa00
swa00
H
  • HoustonWeHaveAProblem
Antworten
3
Aufrufe
803
moin
M
Zurück
Oben Unten