Wie schlecht ist Android SoundPool? Welche Alternative zu verwenden?

77

Ich habe Android SoundPoolals Mechanismus zur Implementierung von Soundeffekten in meiner allgemeinen Spieleentwicklungsbibliothek betrachtet. Es schien ideal.

Aber ein wenig Forschung zeigt , dass es alle Arten von Bugs in SoundPool. Sind die Fehler SoundPoolnoch relevant?

Da ich eine Bibliothek entwickle, werden alle Fehler SoundPoolzu Fehlern in meiner Bibliothek, und ich möchte meine Benutzer davon isolieren.

Meine Frage lautet also im Grunde: Welche API soll ich für Audio verwenden?

Das Verwenden AudioTrackund Schreiben meines eigenen Mixers kommt nicht in Frage. Aber natürlich wäre es vorzuziehen, dies zu vermeiden. Und gibt es eine API, die mir die Dekodierung ermöglicht?

Ich muss in der Lage sein, eine angemessene Anzahl gleichzeitiger Soundeffekte (mindestens 16, sagen wir) abzuspielen und noch offener zu sein. Sounds müssen mit geringer Latenz abgespielt werden. WAVDateien müssen unterstützt werden (MP3 / Ogg ist unwichtig). Soundeffekte müssen nahtloses Looping und eine dynamische, individuelle Lautstärkeregelung unterstützen. Der Lebenszyklus der Android-App muss ordnungsgemäß unterstützt werden.

Ich habe gehört, dass es irgendwo ein Limit von 1 MB SoundPoolgibt. Dies ist wahrscheinlich für jeden einzelnen Soundeffekt akzeptabel, aber nicht für alle Puffer / Sounds. Kann mir jemand genau sagen, wo das Limit liegt?

Schließlich muss ich auch Hintergrundmusik in komprimierten Formaten mit geringer CPU-Auslastung abspielen können. Ich nehme an, das MediaPlayerist ideal dafür. Kann es parallel zu einer anderen API verwendet werden?

Ich weiß, dass einige Leute verwendet haben MediaPlayer, um für zu füllen SoundPool. Aber unterstützt es die Funktionen, die ich brauche?

Gibt es andere Audio-APIs, die ich vermisst habe?

Andrew Russell
quelle
3
Ich habe mir die Fehler angesehen, mit denen Sie in Verbindung gebracht haben, und keiner von ihnen scheint sehr katastrophal zu sein. Vielleicht fehlt mir etwas, aber ich würde sagen, benutze es einfach und wenn du Fehler findest, melde sie. Ein großes Lob an Sie für Ihre Hausaufgaben!
SLF
@slf Ich sollte darauf hinweisen, dass dies nur zufällige Beispiele sind - es gibt Berichte über Absturzfehler (sowohl App als auch Gerät) und No-Audio-Fehler im Internet. Es gibt viele von ihnen - aber ich kann nicht sagen, ob es daran SoundPoolliegt, dass es fehlerhaft ist oder die Leute es einfach nicht richtig benutzen oder so. Es gibt einige Stellen, die darauf hindeuten, dass einige der schlimmsten Fehler gerätespezifisch sind. Und sind es nur ein oder zwei alte Geräte, die ich ignorieren kann? Oder erfordern ihre vielen Geräte viele verschiedene Problemumgehungen? (Wofür ich nicht die Ressourcen habe, um zu unterstützen.)
Andrew Russell
@ AndrewRussell Was ist daraus geworden? SoundPool verarbeitet keine Ogg-Dateien von 90 KB, was die klassische 1M-Protokollausgabe ergibt - total dumm. Ich habe die gleichen Anforderungen wie Sie. Alle Tipps wäre dankbar.
Zaf
Meine App hat Probleme beim Abspielen von Sounds auf dem Samsung Galaxy S2. Ich habe herumgegoogelt und festgestellt, dass die SoundPool-Klasse der Schuldige ist. Weitere Informationen finden Sie unter cocos2d-x.org/boards/10/topics/7980 . Anscheinend hat die Soundpool-Klasse Probleme beim Abspielen von Sounds in Dual-Core-Telefonen. Also ist es besser, es zu vermeiden ...
Arif Nadeem
@ AndrewRussell Darf ich fragen, was hast du am Ende gemacht? Ich spiele einige Zeit mit der Bibliothek herum und bis jetzt funktioniert es nicht sehr gut
Efi G

Antworten:

16

Nur um ein aktuelles Feedback zu diesem Thema hinzuzufügen. Ich verwende SoundPool seit einiger Zeit in einer App mit einer ziemlich großen Benutzerbasis für Tastendrucksounds. Unser Anwendungsfall:

  • Muss sofort gespielt werden
  • Bis zu 3+ Sounds parallel
  • Wir nutzen setRatedas gesamte Sortiment[0.5f-2.0f]

Ich habe jetzt zwei große gerätespezifische Probleme und habe beschlossen, meine Verluste zu reduzieren und von SoundPool abzuweichen

  • Eine große Anzahl von 4,4 LG-Geräten (hauptsächlich die LG G2 / G3-Reihe) hatte mit der Implementierung von SoundPool einen nativen Absturz. Dies wurde in einem Update (irgendwann) behoben, aber wir haben immer noch viele Benutzer mit nicht aktualisierten Geräten
  • Sony Xperia-Geräte haben derzeit alle möglichen Probleme mit SoundPool, wie von anderen berichtet . In meinem Fall habe ich festgestellt, dass bei Verwendung setRatemit rate > 1.0fSoundPool Ausnahmen ausgelöst werden, bis Ihre App beendet wird (und dabei eine Menge Batterie verbraucht wird).

TL; DR; Ich denke nicht mehr, dass es die Gefahr / den Aufwand wert ist, SoundPool zu debuggen

Sparky
quelle
Es ist absurd, dass dies immer noch ein Problem ist. Wenn ich jemals wieder in Android dev ( shudder ) zurückkomme, werde ich SoundPool verdammt noch mal nicht verwenden. Akzeptiert.
Andrew Russell
Als weiteres Follow-up. Es scheint, dass auf einigen dieser Geräte die Probleme tiefer gehen als nur SoundPool. Das Anpassen der Wiedergaberate auf dem Xperia hat immer noch Probleme, wenn ich ein verwende AudioTrack. Aber auf der anderen Seite scheine ich in der Lage zu sein, sie zu umgehen AudioTrack, nicht der Fall beiSoundPool
Sparky
2
@Sparky Was verwenden Sie derzeit anstelle von SoundPool? AudioTracknur mit eigener Mixer-Implementierung? Oder irgendeine andere Bibliothek?
Bogumil
@Sparky und andere, die Input haben: Was hast du als Soundpool-Alternative gewählt?
IcedDante
1
@ Parky neugierige Köpfe wollen wissen, was Sie stattdessen verwendet haben ... sagen Sie uns Ihr Geheimnis :-p
Jemand irgendwo
9

Halten Sie sich an OGG-Dateien und SoundPool wird Ihnen gut tun. Es liegt in der Natur des Multi-Plattform-Tieres Android, dass es Hardwarekonfigurationen geben wird, die nicht mit jedem wichtigen Programm funktionieren, egal wie fleißig die Programmierer es versuchen.

Wenn es sich um ein großes und gut finanziertes Projekt handelt, fügen Sie der Finanzierung eines der wichtigsten Telefone zum Testen hinzu. Es ist tatsächlich viel billiger als die Zeit, die der Programmierer damit verbracht hat, zu recherchieren und zu erraten, wie hoch ihre Leistung ist.

Es tut uns leid. Scheint, als wäre dies nicht die Antwort, nach der Sie gesucht haben. Viel Glück!

SMBiggs
quelle
Ich habe nicht die Erfahrung gemacht, dass die Verwendung von OGG-Dateien anstelle von MP3-Dateien einwandfrei funktioniert. Ich hatte MP3-Dateien mit 3 KB, 3 KB, 8 KB, 16 KB, 52 KB und 52 KB, die jeweils an eine andere Geste gebunden waren. ich könnte sie nie alle laden; Welcher der letzten der größten 3 geladenen war, führte zu 'AudioFlinger konnte keine Spur erstellen, Status: -12'. Ich habe versucht, sie alle in .ogg-Dateien zu ändern, und ich hatte genau die gleichen Ergebnisse.
John.k.doe
Hmmm, deine Dateigrößen sollten kein Problem sein. Irgendwelche Lösungen?
SMBiggs
Ich brauchte keine super hohe Leistung, also habe ich mich für einen hybriden Ansatz entschieden. Die kleineren Dateien (und ich habe mehr hinzugefügt; ich habe jetzt 11) befinden sich in einem Soundpool (und alle sind ironischerweise immer noch MP3), und die größeren Dateien erhalten jeweils ihren eigenen MediaPlayer. scheint immer noch fehlerhaft; Gelegentlich scheint eine der Soundpool-Dateien nicht geladen zu werden, und ich versuche zu diagnostizieren, warum. aber keiner von ihnen ist über 11 KB groß.
John.k.doe
Verwenden Sie Dienste oder andere Threads? Vielleicht erstellen Sie mehr als eine Kopie von SoundPool oder einen Manager? Meine Bauchreaktion auf Ihre Beschreibung ist, dass etwas auf die Zehen einer anderen Sache tritt. Die Größe der Dateien ist wirklich trivial - das sollte überhaupt kein Problem sein. Ich schlage vor, Ihr Problem zu einer eigenen Frage zu machen. Auf diese Weise erhalten Sie mehr Augen und die Möglichkeit, den Code genauer zu erklären (und zu liefern).
SMBiggs
Scott, ich könnte das tun, weil das Problem komplizierter ist, als dies Platz bietet. Mein einziger Punkt in meinem ursprünglichen Kommentar war, dass das Ändern selbst kleiner MP3-Dateien in OGG-Dateien an und für sich das Problem nicht löste, während das Problem darin bestand, diese kleinen Ressourcen in ihre eigenen MediaPlayer-Objekte zu übernehmen. (Ich werde sagen, dass ich denke, dass es möglich ist, dass das Setzen einer Endlosschleife für einige der Sounds zu dem Problem beiträgt. Ich wünschte, ich hätte mehr Zeit, um es zu debuggen, um es sicher zu wissen Ich habe Zeit ...)
John.k.doe
3

HAFTUNGSAUSSCHLUSS: Ich habe wenig Erfahrung mit MediaPlayer und keine erfolgreiche Erfahrung mit den anderen APIs, die ich erwähne. Die folgenden Informationen basieren auf dem, was ich in den DOCs gelesen habe und was ich aus Google-Suchen gelesen habe.

Sie könnten Mediaplayer (für die Hintergrundmusik) mit anderen Audio-APIs verwenden, da MediaPlayer automatisch in einem eigenen Thread ausgeführt wird, aber ich glaube, dass es eine hohe CPU-Auslastung hat, und ich denke nicht, dass es sehr gut komprimierte Bits aufnehmen würde. aber ich bin mir nicht sicher.

Es gibt auch JetPlayer http://developer.android.com/reference/android/media/JetPlayer.html, der eine Menge Arbeit zu bieten scheint, aber effektiv funktioniert, wenn Hintergrundmusik abgespielt und dann nach Bedarf andere Sounds abgespielt werden im Spiel. Nach dem, was ich über die DOCs gelesen habe, wird eine MIDI-Datei benötigt (glaube ich?), Und Sie schalten Tracks stumm und auf, damit sie so funktionieren, wie Sie es möchten.

Ich mag AudioTrack, weil es Ihnen die Möglichkeit gibt, Sounds zur Laufzeit zu bearbeiten, indem Sie die Frequenzen des Sounds ändern, und SoundPool kann dasselbe tun.

Für Ihre Situation scheint AudioTrack nicht gut zu funktionieren, da für das Abspielen von zwei Sounds zwei Threads erforderlich sind, da AudioTrack blockiert (da bin ich mir ziemlich sicher).

Und mit SoundPool denke ich, dass Sie, da Sie 16 Sounds haben, vielleicht zwei Threads mit einem SoundPool in jedem Thread nehmen und 8 Sounds auf jeden SoundPool anwenden. Ich weiß es allerdings nicht wirklich, da ich noch nie versucht habe, SoundPool zu verwenden.

Und wieder basieren meine Informationen nicht auf Erfahrungen, sondern nur auf dem, was ich gelesen habe. Ich kann mich also völlig oder nur leicht irren, oder wer weiß.

Und ich weiß wirklich nichts über die SoundPool-Fehler, da ich sie nicht recherchiert habe.

Schilf
quelle