Ich habe Android SoundPool
als 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 SoundPool
noch relevant?
Da ich eine Bibliothek entwickle, werden alle Fehler SoundPool
zu 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 AudioTrack
und 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. WAV
Dateien 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 SoundPool
gibt. 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 MediaPlayer
ist 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?
SoundPool
liegt, 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.)Antworten:
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:
setRate
das 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
setRate
mitrate > 1.0f
SoundPool 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
quelle
SoundPool
. Das Anpassen der Wiedergaberate auf dem Xperia hat immer noch Probleme, wenn ich ein verwendeAudioTrack
. Aber auf der anderen Seite scheine ich in der Lage zu sein, sie zu umgehenAudioTrack
, nicht der Fall beiSoundPool
AudioTrack
nur mit eigener Mixer-Implementierung? Oder irgendeine andere Bibliothek?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!
quelle
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.
quelle