Dieser Abschnitt enthält die Informationen, die für die ersten Schritte mit den OpenSL ES APIs erforderlich sind.
OpenSL ES zu Ihrer App hinzufügen
Sie können OpenSL ES sowohl über C- als auch über C++-Code aufrufen. So fügen Sie die Core-Version von OpenSL ES hinzu:
für Ihre App haben, fügen Sie die Headerdatei OpenSLES.h
hinzu:
#include <SLES/OpenSLES.h>
So fügst du die Android-Erweiterungen von OpenSL ES hinzu:
Fügen Sie außerdem die Headerdatei OpenSLES_Android.h
ein:
#include <SLES/OpenSLES_Android.h>
Wenn Sie die Headerdatei OpenSLES_Android.h
einbinden, werden die folgenden Header eingefügt:
automatisch:
#include <SLES/OpenSLES_AndroidConfiguration.h> #include <SLES/OpenSLES_AndroidMetadata.h>
Hinweis: Diese Header sind nicht erforderlich, sollen aber beim Erlernen der API hilfreich sein.
Build und Fehler beheben
Sie können OpenSL ES in Ihren Build integrieren, indem Sie es im
Android.mk
-Datei, die als eine der
die Makefiles des NDK-Systems. Fügen Sie folgende Zeile zu
Android.mk
:
LOCAL_LDLIBS += -lOpenSLES
Für eine zuverlässige Fehlerbehebung empfehlen wir, den SLresult
-Wert zu prüfen, der die meisten
die OpenSL ES APIs zurückgeben. Sie können
Assertions
oder fortgeschrittenere Logik
zur Fehlerbehandlung bei der Fehlerbehebung, Keines der Angebote
Dies ist ein inhärenter Vorteil der Arbeit mit OpenSL ES, auch wenn die eine oder die andere möglicherweise besser geeignet ist.
für einen bestimmten Anwendungsfall.
Wir verwenden Assertions in unserem Beispiele, da sie dabei helfen, unrealistische Bedingungen zu erkennen, die auf einen Codierungsfehler hinweisen könnten. Mi. bei anderen Bedingungen, die in der Produktion häufiger auftreten, eine explizite Fehlerbehandlung verwendet haben.
Viele API-Fehler führen neben einem Ergebniscode ungleich null zu einem Logeintrag. Solche Logeinträge
kann zusätzliche Details liefern, die sich bei relativ komplexen APIs wie
<ph type="x-smartling-placeholder"></ph>
Engine::CreateAudioPlayer
Sie können das Protokoll entweder über die Befehlszeile oder über Android Studio aufrufen. So überprüfen Sie das Protokoll von in die Befehlszeile Folgendes ein:
$ adb logcat
Um das Protokoll aus Android Studio zu überprüfen, wählen Sie View > Tool-Fenster > Logcat Weitere Informationen finden Sie unter Logs mit Logcat schreiben und ansehen.
Beispielcode
Wir empfehlen die Verwendung von unterstütztem und getestetem Beispielcode, der als Modell für Ihren eigenen Code verwendet werden kann. der sich im Audio-Echo und Native Audio Ordner des android-ndk GitHub zu erstellen.
Achtung: Die Spezifikation von OpenSL ES 1.0.1 enthält in den Anhängen Beispielcode (siehe Khronos OpenSL ES Registry . Die Beispiele in Anhang B: Beispielcode und In Anhang C: Beispielcode für Anwendungsfälle werden Funktionen verwendet, die von Android nicht unterstützt werden. Einige Beispiele enthalten typografische Fehler oder verwenden APIs, die sich wahrscheinlich ändern. Fortfahren mit Vorsicht: aber der Code könnte hilfreich sein, um die vollständige OpenSL-E-Mail zu verstehen. sollte sie nicht in der vorliegenden Form unter Android verwendet werden.
Audio-Inhalt
Im Folgenden finden Sie einige der vielen Möglichkeiten, Audioinhalte für Ihre App zu verpacken:
- Ressourcen: Wenn Sie Ihre Audiodateien im Ordner
res/raw/
ablegen, können sie ganz einfach über die zugehörigen APIsResources
Da es jedoch keinen direkten nativen Zugriff auf Ressourcen gibt, müssen Sie Java schreiben. Programmiersprachen-Code, um sie vor der Verwendung zu kopieren. - Assets: Wenn Sie Ihre Audiodateien im Ordner
assets/
ablegen, sind direkt über die nativen Android Asset Manager APIs zugänglich. Headerdateien ansehen Unterandroid/asset_manager.h
undandroid/asset_manager_jni.h
finden Sie weitere Informationen dazu. APIs Den Beispielcode im Android NDK Das GitHub-Repository verwendet diese nativen Asset Manager APIs in Verbindung mit der Android-Datei Deskriptor Data Locator. - Netzwerk: Mit dem URI-Data Locator können Sie Audioinhalte direkt abspielen. aus dem Netzwerk. Sie sollten sich jedoch Sicherheit und Berechtigungen
- Lokales Dateisystem: Die URI-Datensuche unterstützt das Schema
file:
. für lokale Dateien, vorausgesetzt, die Anwendung kann auf die Dateien zugreifen. Beachten Sie, dass die Android- Sicherheits-Framework schränkt den Dateizugriff über die Linux-Nutzer-ID- und Gruppen-ID-Mechanismen ein. - Aufgezeichnet: Ihre App kann Audiodaten vom Mikrofoneingang, diesen Inhalt speichern und ihn später wiedergeben. Im Beispielcode wird diese Methode für den Wiedergabeclip.
- Inline kompiliert und verknüpft: Sie können Ihre Audioinhalte direkt mit
und dann in einem Audioplayer mit
Pufferwarteschlangen-Datensuche wiedergegeben werden. Dieses
eignet sich am besten für kurze Clips im PCM-Format. Im Beispielcode wird diese Technik für den
Hello- und Android-Clips Die PCM-Daten wurden mit einem
bin2c
-Tool (nicht enthalten). - Echtzeit-Synthese: Ihre Anwendung kann PCM-Daten im Handumdrehen synthetisieren und und es dann in einem Audioplayer mit Zwischenspeicherwarteschlangen-Data Locator wiedergeben. Dies ist ein relativ anspruchsvolles und die Details der Audiosynthese werden in diesem Artikel nicht behandelt.
Hinweis: Das Finden und Erstellen nützlicher Audioinhalte für Ihre App wird in diesem Artikel nicht behandelt. Du kannst Suchbegriffe wie interaktive Audio, Audio von Spielen oder Ton verwenden. Design und Audioprogrammierung, um weitere Informationen zu finden.
Achtung:Sie sind dafür verantwortlich. um sicherzustellen, dass Sie gesetzlich dazu berechtigt sind, Inhalte abzuspielen oder aufzunehmen. Möglicherweise gibt es Datenschutz für das Aufzeichnen von Inhalten.
Codebeispiele
Die folgenden Beispielanwendungen sind auf unserer GitHub-Seite verfügbar:
- Audio-Echo erstellt eine Eingabe-zu-Ausgabe-Roundtrip-Schleife.
- Native Audio ist ein einfacher Audiorekorder/-player.
Die Android-NDK-Implementierung von OpenSL ES unterscheidet sich der Referenzspezifikation für OpenSL ES 1.0.1. Diese Unterschiede sind ein wichtiger Grund dafür, dass Beispielcode, die Sie direkt aus der OpenSL ES-Referenzspezifikation kopieren, Android-App
Weitere Informationen zu den Unterschieden zwischen der Referenzspezifikation und der Android-Implementierung, siehe OpenSL ES for Android