Ich habe eine einfache Android-App für Musiksequenzer entwickelt, die mehrere Audiodateien abspielt.
Ursprünglich habe ich SoundPool verwendet, um MP3-Dateien abzuspielen, und es funktionierte perfekt auf 2.3.4 mit einem alten HTC Droid Incredible. Dann habe ich es auf einem Galaxy Nexus mit 4.3 getestet und die Leistung war schrecklich. Die Audio-Timing überall und es gab Störungen / Klicks / Pop.
Also habe ich mehrere Tage damit verbracht, einen Player mit AudioTrack inklusive einem MP3-Decoder zu bauen und es funktionierte perfekt sowohl auf dem Galaxy als auch auf dem HTC. Jetzt habe ich es gerade auf einem Nexus 4 getestet (läuft 4.3) und die Leistung ist schrecklich - das Timing ist überall. SoundPool bietet sogar bessere Leistung auf diesem Gerät.
Ich bin wirklich frustriert und weiß nicht, was ich tun soll, um meine App zu beenden, also würde ich es wirklich schätzen, wenn mir jemand helfen könnte. Ich habe einige Codebeispiele meines Audio-Players darunter gelegt. Ich habe alles versucht, einschließlich der Änderung der Puffergröße, mit AudioTrack.MODE_STATIC
usw. Die neuen Google-Geräte haben niedrige Latenz-Audio, so ist es sehr seltsam, wie alles funktioniert besser auf meinem alten Droiden!
Vielen Dank im Voraus
%Vor%Wie der Benutzer harikris vorschlägt, würde ich Ihnen wärmstens empfehlen, Ihren gesamten Audiowiedergabe- und -verarbeitungscode mithilfe der OpenSL ES-Bibliothek auf Android NDK zu verschieben, um die beste Leistung zu erzielen.
Wie ich es verstehe, ist die AudioTrack API auf dem OpenSL ES Buffer Queue Audio Player aufgebaut. Sie könnten also die Leistung verbessern, indem Sie direkt mit dem NDK arbeiten und C-Code schreiben, der von Ihrer Java / Android-Ebene aufgerufen wird, um mit dem Sound zu arbeiten.
Das oben erwähnte native-audio-Beispiel enthält Code, der Ihnen zeigt, wie Sie eine Sounddatei direkt von einem URI abspielen. Nach meiner Erfahrung sind die Ergebnisse dieser Methode besser als AudioTrack im statischen Modus.
Soundpool ist im Allgemeinen für sehr kurze Sounds reserviert, die aus dem Speicher gespielt werden können, und es ist keine skalierbare Lösung für Ihren Sequenzer, besonders wenn Sie große Dateien einführen.
Hier sind einige Links, die mir bei meinen Anwendungen geholfen haben: -Allgemeine Informationen zu OpenSL ES für Android: Ссылка
- Ein Android-Audio-Blog mit gutem Beispielcode: Ссылка
Bearbeiten: Der alte mobile Perlenlink scheint nicht verfügbar zu sein. Hier ist eine funktionierende: Ссылка
In der High Performance Audio -Sitzung auf Google I / O 2013 (vorgestellt von Ian Ni-Lewis) (Ich bin überrascht, dass er das nicht aufgegriffen hat), sie sprechen über den Nexus 4. Im Video der Präsentation springen Sie zu 27:25.
Im Gegensatz zu vielen anderen Geräten, die eine Sample-Rate von 44,1 kHz verwenden, verwendet das Nexus 4 48 kHz. Wenn Sie Daten mit 44,1 kHz senden, müssen Sie den Resampler durchlaufen, der sich auf dem langsamen Pfad befindet. Ein weiterer Unterschied ist, dass die Puffergröße des Nexus 4 240 Frames beträgt, was zu einem regelmäßigen Jitter in Ihrem Callback führen kann. Dies alles wird im verlinkten Video erklärt.
Ich würde Ihnen empfehlen, all Ihre Audioaufnahme und zeitkritische Verarbeitung in nativem Code durchzuführen und JNI zu verwenden, um zwischen den SDK- und NDK-Komponenten zu interagieren.
Sie finden den Beispielcode für ein natives Audio-Projekt in der Android NDK-Distribution , die Sie anzeigen wie man Audio in C / C ++ macht
Tags und Links java android audio audiotrack soundpool